我正在尝试一个具有某些对象列表(由另一个类指定)的类以字符串形式保留在数据库中(使用JPA Converter-很好)。 然后,我想使用“规范”在该字符串中进行搜索。 创建谓词的最佳方法是什么?我似乎不了解AttributeConverter和规范中表达式之间的联系。
父类:
@Entity @Table
public class A {
@Column @Id @GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
@Column
private String name;
@Enumerated(EnumType.STRING)
private SomeType type;
@Column(length=1000) @Convert(converter = BConverter.class)
private List<B> bList;
private Integer no;
}
列出的对象类:
public class B{
private String type;
private Integer quantity;
}
转换器:
@Converter
public class BConverter implements AttributeConverter<List<B>, String> {
private static final String SEPARATOR = ":";
private static final String LIST_SEPARATOR = ";";
@Override public String convertToDatabaseColumn(List<B> bList) {
return bList.stream().map(e->convertToString(e)).collect(Collectors.joining(LIST_SEPARATOR));
}
@Override public List<B> convertToEntityAttribute(String str) {
if(str==null || str.isEmpty() ) return null;
return Arrays.stream(str.split(LIST_SEPARATOR)).map(e->convertFromString(e)).collect(Collectors.toList());
}
private String convertToString(B b){
if(entity==null) return null;
return b.getType().toString() +SEPARATOR+ b.getQuantity().toString();
}
private B convertFromString(String subStr){
if(subStr==null || subStr.isEmpty() ) return null;
String[] pair = subStr.split(SEPARATOR);
return new B(pair[0],Integer.valueOf(pair[1]));
}
}
数据库中的内容应类似于:
表A:
id: 1;
name: "Some Name";
type: "THISTYPE";
blist: "TYPE1:11;TYPE2:22";
no: 0;
id: 2;
name: "Other Name";
type: "THISTYPE";
blist: "TYPE1:45;TYPE2:56";
no: 12;
然后,我想创建规格以在该表中搜索bList内的属性。 例如,通过包含B对象的实体进行搜索,其中B对象的类型为TYPE1,数量为= 30。
public static Specification<A> customSpecification(String type, Integer value) {
return (root, query, builder) -> ///?????????
}
在DB属性为String但JAVA仅看到对象的情况下,是否可以使用这种规范?