gpt4 book ai didi

java - 如何对 ElementCollection 和 CollectionTable 使用 CriteriaQuery

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:09:52 26 4
gpt4 key购买 nike

我有一个非常简单的实体产品,它有代码、名称和标签。标签存储在另一个表 (product_tag) 中,其中包含 product_id 和 tag 列。

我需要使用 CriteriaQuery 搜索带有特定标签的产品。举个例子,我想找到带有“水果”和“红色”标签的产品。

使用 spring 4.1.x、spring-data-jpa 1.8 和 hibernate 4.2.x。

我的实体只是;

@Entity
@Table(name = "product", uniqueConstraints ={
@UniqueConstraint(columnNames = "code")
}
)
@NamedQueries({
@NamedQuery(name = "Product.findAll", query = "select p from Product p")
})
public class Product extends EntityWithId {

@Column(name = "code", length = 128)
private String code;

@Column(name = "name", length = 512)
protected String name;

@ElementCollection(fetch = FetchType.EAGER)
@CollectionTable(name="product_tag", joinColumns=@JoinColumn(name="product_id"))
@Column(name="tag")
private Set<String> productTags = new HashSet<>();

}

这是我如何启动搜索的代码;

private void search() {

CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<Product> criteriaQuery = builder.createQuery(Product.class);
Root<Product> product = criteriaQuery.from(Product.class);

Predicate where = builder.conjunction();

if (!StringUtils.isEmpty(nameSearch.getValue())) {
where = builder.and(where, builder.like(product.<String>get("name"), nameSearch.getValue() + "%"));
}

if (!StringUtils.isEmpty(codeSearch.getValue())) {
where = builder.and(where, builder.like(product.<String>get("code"), codeSearch.getValue() + "%"));
}

if (!StringUtils.isEmpty(tagsSearch.getValue())) {
//Util.parseCommaSeparated returns Set<String>
where = builder.and(where, product.get("productTags").in(Util.parseCommaSeparated(tagsSearch.getValue())));
}

criteriaQuery.where(where);
List<Product> resultList = entityManager.createQuery(criteriaQuery).getResultList();

}

但是,当我搜索标签“fruit”时出现异常

java.lang.IllegalArgumentException: Parameter value [fruit] did not match expected type [java.util.Set (n/a)]

我真的很想知道对 ElementCollection 和 CollectionTable 使用 CriteriaQuery。

最佳答案

productTags 映射到一个单独的表,因此您需要在查询中加入该表。

...

if (!StringUtils.isEmpty(tagsSearch.getValue())) {
//Util.parseCommaSeparated returns Set<String>
where = builder.and(where, product.join("productTags").in(Util.parseCommaSeparated(tagsSearch.getValue())));
}

...

注意 product.join("productTags") 而不是 product.get("productTags")

关于java - 如何对 ElementCollection 和 CollectionTable 使用 CriteriaQuery,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29835940/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com