Java 查询父项';s集合-Hibernate规范
我用Hibernate创建了三个表Product是父项,条形码是产品的集合端price是产品的子项(一对多)Java 查询父项';s集合-Hibernate规范,java,spring,hibernate,jpa,hibernate-criteria,Java,Spring,Hibernate,Jpa,Hibernate Criteria,我用Hibernate创建了三个表Product是父项,条形码是产品的集合端price是产品的子项(一对多) @NotBlank private String ref; @ElementCollection(fetch = FetchType.EAGER) @CollectionTable(name = "products_barcodes") @Fetch(FetchMode.SELECT) private List<String> barcodes;
@NotBlank
private String ref;
@ElementCollection(fetch = FetchType.EAGER)
@CollectionTable(name = "products_barcodes")
@Fetch(FetchMode.SELECT)
private List<String> barcodes;
@OneToMany(mappedBy = "parent", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
private List<PriceEntity> prices;
谢谢托马斯的评论解决了这个问题
对于集合
criteriaBuilder.isMember
。定义“不工作”。它不能编译吗?它是否在运行时抛出异常?“只是返回了错误的结果吗?”托马斯感谢你指出这一点。我已经更新了这个问题。criteriaBuilder.equal(…)
无法处理集合和值。我已经有一段时间没有使用条件查询了,但是您应该看看isMember()
,例如criteriaBuilder.isMember(barcode,root.get(“parent”).get(“barcode”))
。谢谢@Thomas。你的回答解决了问题
Specifications<PriceEntity> specifications = where(hasTenant(tid));
if (isNotBlank(ref)) {
specifications = specifications.and(hasRef(ref));
}
if (isNotBlank(barcode)) {
specifications = specifications.and(hasBarcode(barcode));
}
/*********************************/
public static Specification<PriceEntity> hasRef(final String ref) {
return new Specification<PriceEntity>() {
@Override
public Predicate toPredicate(Root<PriceEntity> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
return criteriaBuilder.equal(root.<PriceEntity>get("parent").get("ref"), ref);
}
};
}
public static Specification<PriceEntity> hasBarcode(final String barcode) {
return new Specification<PriceEntity>() {
@Override
public Predicate toPredicate(Root<PriceEntity> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
return criteriaBuilder.equal(root.<PriceEntity>get("parent").get("barcodes"), barcode);
}
};
}
"IllegalArgumentException: Parameter value [8003921360408] did not match expected type [java.util.Collection (n/a)]"