Как использовать объект в качестве фильтра в собственном запросе JPA?JAVA

Программисты JAVA общаются здесь
Anonymous
Как использовать объект в качестве фильтра в собственном запросе JPA?

Сообщение Anonymous »

У меня есть собственный запрос, который принимает для фильтрации 4 (необязательных) параметра. 4 — это слишком много для читаемости, поэтому я решил заменить его объектом. При этом я столкнулся с двумя отдельными проблемами.
Во-первых, я просто попробовал сделать POJO в качестве фильтра:

Код: Выделить всё

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder(toBuilder = true)
public class QuestionCategoryFilter {
private String name;
private Boolean active;
private Integer orderNumber;
private String answerTypeName;
}
но потом я получил следующую ошибку:

Код: Выделить всё

org.springframework.orm.jpa.JpaSystemException: A problem occurred in the SQL executor : No JDBC mapping could be inferred for parameter - org.hibernate.sql.exec.internal.JdbcParameterImpl@6c173735
Поэтому позже я наткнулся на решение, буквально просто нажав CTRL + щелкнув классы спящего режима, и мой поиск привел к org.hibernate.type.QueryParameterJavaObjectType.
Расширение этого класса действительно решило проблему, мой запрос мог быть выполнен нормально, но позже, добавляя Swagger-UI в проект, я столкнулся с проблемой моего простого объекта с 4 полями, который на самом деле был гигантский:

Код: Выделить всё

{
"jdbcType": {
"integer": true,
"float": true,
"number": true,
"binary": true,
"castType": "STRING",
"ddlTypeCode": 0,
"duration": true,
"nationalized": true,
"string": true,
"interval": true,
"friendlyName": "string",
"lobOrLong": true,
"jdbcTypeCode": 0,
"temporal": true,
"stringLike": true,
"lob": true,
"defaultSqlTypeCode": 0,
"decimal": true
},
"jdbcValueBinder": {},
"jdbcValueExtractor": {},
"jdbcLiteralFormatter": {},
"name": "string",
"active": true,
"orderNumber": 0,
"answerTypeName": "string",
"mutable": true,
"associationType": true,
"componentType": true,
"collectionType": true,
"anyType": true,
"entityType": true,
"castType": "STRING",
"registrationKeys": [
"string"
],
"javaTypeDescriptor": {
"javaType": {
"typeName": "string"
},
"typeName": "string",
"defaultValue": {},
"comparator": {},
"mutabilityPlan": {
"mutable": true
},
"longSqlLength": 0,
"temporalType": true
},
"valueConverter": {
"relationalJavaType": {
"javaType": {
"typeName": "string"
},
"typeName": "string",
"defaultValue": {},
"comparator": {},
"mutabilityPlan": {
"mutable": true
},
"longSqlLength": 0,
"temporalType": true
},
"domainJavaType": {
"javaType": {
"typeName": "string"
},
"typeName": "string",
"defaultValue": {},
"comparator": {},
"mutabilityPlan": {
"mutable": true
},
"longSqlLength": 0,
"temporalType": true
}
},
"mappedType": {
"mappedJavaType": {
"javaType": {
"typeName": "string"
},
"typeName": "string",
"defaultValue": {},
"comparator": {},
"mutabilityPlan": {
"mutable": true
},
"longSqlLength": 0,
"temporalType": true
}
},
"jdbcTypeCount": 0,
"jdbcMapping": {
"jdbcJavaType": {
"javaType": {
"typeName": "string"
},
"typeName": "string",
"defaultValue": {},
"comparator": {},
"mutabilityPlan": {
"mutable": true
},
"longSqlLength":  0,
"temporalType": true
},
"jdbcType": {
"integer": true,
"float": true,
"number": true,
"binary": true,
"castType": "STRING",
"ddlTypeCode": 0,
"duration": true,
"nationalized": true,
"string": true,
"interval": true,
"friendlyName": "string",
"lobOrLong": true,
"jdbcTypeCode": 0,
"temporal": true,
"stringLike": true,
"lob": true,
"defaultSqlTypeCode": 0,
"decimal": true
},
"jdbcValueBinder": {},
"castType": "STRING",
"valueConverter": {
"relationalJavaType": {
"javaType": {
"typeName": "string"
},
"typeName": "string",
"defaultValue": {},
"comparator": {},
"mutabilityPlan": {
"mutable": true
},
"longSqlLength": 0,
"temporalType": true
},
"domainJavaType": {
"javaType": {
"typeName": "string"
},
"typeName": "string",
"defaultValue": {},
"comparator": {},
"mutabilityPlan": {
"mutable": true
},
"longSqlLength": 0,
"temporalType": true
}
},
"jdbcTypeCount": 0,
"mappedJavaType": {
"javaType": {
"typeName": "string"
},
"typeName": "string",
"defaultValue": {},
"comparator": {},
"mutabilityPlan": {
"mutable": true
},
"longSqlLength": 0,
"temporalType": true
},
"javaTypeDescriptor": {
"javaType": {
"typeName": "string"
},
"typeName": "string",
"defaultValue": {},
"comparator": {},
"mutabilityPlan": {
"mutable": true
},
"longSqlLength": 0,
"temporalType": true
},
"jdbcLiteralFormatter": {},
"singleJdbcMapping": "string",
"jdbcValueExtractor": {}
},
"mappedJavaType": {
"javaType": {
"typeName": "string"
},
"typeName": "string",
"defaultValue": {},
"comparator": {},
"mutabilityPlan": {
"mutable": true
},
"longSqlLength": 0,
"temporalType": true
},
"expressibleJavaType": {
"javaType": {
"typeName": "string"
},
"typeName": "string",
"defaultValue": {},
"comparator": {},
"mutabilityPlan": {
"mutable": true
},
"longSqlLength": 0,
"temporalType": true
},
"singleJdbcMapping": {
"jdbcJavaType": {
"javaType": {
"typeName": "string"
},
"typeName": "string",
"defaultValue": {},
"comparator": {},
"mutabilityPlan": {
"mutable": true
},
"longSqlLength": 0,
"temporalType": true
},
"jdbcType": {
"integer": true,
"float": true,
"number": true,
"binary": true,
"castType": "STRING",
"ddlTypeCode": 0,
"duration": true,
"nationalized": true,
"string": true,
"interval": true,
"friendlyName": "string",
"lobOrLong":  true,
"jdbcTypeCode": 0,
"temporal": true,
"stringLike": true,
"lob": true,
"defaultSqlTypeCode": 0,
"decimal": true
},
"jdbcValueBinder": {},
"castType": "STRING",
"valueConverter": {
"relationalJavaType": {
"javaType": {
"typeName": "string"
},
"typeName": "string",
"defaultValue": {},
"comparator": {},
"mutabilityPlan": {
"mutable": true
},
"longSqlLength": 0,
"temporalType": true
},
"domainJavaType": {
"javaType": {
"typeName": "string"
},
"typeName": "string",
"defaultValue": {},
"comparator": {},
"mutabilityPlan": {
"mutable": true
},
"longSqlLength": 0,
"temporalType": true
}
},
"jdbcTypeCount": 0,
"mappedJavaType": {
"javaType": {
"typeName": "string"
},
"typeName": "string",
"defaultValue": {},
"comparator": {},
"mutabilityPlan": {
"mutable": true
},
"longSqlLength": 0,
"temporalType": true
},
"javaTypeDescriptor": {
"javaType": {
"typeName": "string"
},
"typeName": "string",
"defaultValue": {},
"comparator": {},
"mutabilityPlan": {
"mutable": true
},
"longSqlLength": 0,
"temporalType": true
},
"jdbcLiteralFormatter": {},
"singleJdbcMapping": "string",
"jdbcValueExtractor": {}
},
"persistenceType": "ENTITY",
"sqmType": {
"sqmType": "string",
"tupleLength": 0,
"typeName": "string",
"expressibleJavaType": {
"javaType": {
"typeName": "string"
},
"typeName": "string",
"defaultValue": {},
"comparator": {},
"mutabilityPlan": {
"mutable": true
},
"longSqlLength": 0,
"temporalType": true
},
"relationalJavaType": {
"javaType": {
"typeName": "string"
},
"typeName": "string",
"defaultValue": {},
"comparator": {},
"mutabilityPlan": {
"mutable": true
},
"longSqlLength": 0,
"temporalType": true
}
},
"tupleLength": 0,
"typeName": "string",
"relationalJavaType": {
"javaType": {
"typeName": "string"
},
"typeName": "string",
"defaultValue": {},
"comparator": {},
"mutabilityPlan": {
"mutable": true
},
"longSqlLength": 0,
"temporalType": true
},
"jdbcJavaType": {
"javaType": {
"typeName": "string"
},
"typeName": "string",
"defaultValue": {},
"comparator": {},
"mutabilityPlan": {
"mutable": true
},
"longSqlLength": 0,
"temporalType":  true
}
}
И я не могу добавить @JsonIgnore или подобные способы, чтобы не подвергать их чванству, поскольку все, кроме четырех, происходят из классов, которыми я не владею.
Итак, каково обычное решение моей проблемы?
Должен ли я отказаться от использования объекта в запросе и развернуть объект при его вызове?

Должен ли я создать отдельный объект фильтра для API, который я затем преобразую в JPA-совместимый объект фильтра?

Или есть ли более простой способ расширения JavaType вместо org.hibernate.type.QueryParameterJavaObjectType?

Вернуться в «JAVA»