Я пытаюсь создать класс, в котором определенный список объектов (заданный другим классом) сохраняется в базе данных в виде строки (используйте 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;
Я бы тогда хотел создать спецификации для поиска поэта таблица для атрибутов внутри списка.Например, поиск по объекту, который содержит объект B, где type = TYPE1 и количество> = 30.
public static Specification<A> customSpecification(String type, Integer value) {
return (root, query, builder) -> ///?????????
}
Есть ли способ использовать такие спецификации, где атрибут DB - это String, но только JAVAвидит объекты?