Предикат поиска JPA AttributeConverter в спецификации - PullRequest
0 голосов
/ 14 февраля 2019

Я пытаюсь создать класс, в котором определенный список объектов (заданный другим классом) сохраняется в базе данных в виде строки (используйте 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видит объекты?

...