规范中的JPA AttributeConverter搜索谓词

时间:2019-02-14 11:26:09

标签: java spring hibernate jpa converters

我正在尝试一个具有某些对象列表(由另一个类指定)的类以字符串形式保留在数据库中(使用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仅看到对象的情况下,是否可以使用这种规范?

0 个答案:

没有答案
相关问题