我有 3 个实体,如下所示。我想编写一个获取产品的查询。在此查询中,参数是 optionValues id 的列表。
现在我的问题是如何加入这些实体?
产品:
public class Product{
//other col
@OneToMany(mappedBy = "product")
private Set<Attribute> attributeSet = new HashSet<>();
}
属性:
public class Attribute{
@OneToOne
@JoinColumn(name = "OPTION_VALUE_ID")
private OptionValue optionValue;
@ManyToOne
@JoinColumn(name="PRODUCT_ID",referencedColumnName="id")
private Product product;
}
选项值:
public class OptionValue{
@Column(name = "id")
private Long id;
@Column(name = "value",updatable = true)
private String value;
}
我写了一个查询,但我认为我的代码不是一个好的解决方案。
Criteria aCriteria = null;
if (!optionValueList.isEmpty()) {
aCriteria = currentSession().createCriteria(Attribute.class, "attribute");
aCriteria.createAlias("attribute.optionValue", "optionValue");
aCriteria.add(Restrictions.in("optionValue.id", optionValueList));
attributes = aCriteria.list();
}
PagingData<Product> pagingData = new PagingData<>();
Criteria criteria = currentSession().createCriteria(Product.class, "product");
if (!attributes.isEmpty()) {
for (Attribute attribute:attributes){
longList.add(attribute.getId());
}
criteria.createAlias("product.attributeSet", "attribute");
criteria.add(Restrictions.in("attribute.id", longList));
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
}
最佳答案
一般的想法是从创建要返回的对象的条件开始,然后通过添加连接的条件进一步移动。所以我从 Parent
类开始,添加限定符并以大多数嵌套元素 OptionValue
结束。
下面的代码未经测试,但您应该明白了:
Criteria criteria = currentSession()
.createCriteria(Product.class)
.createCriteria("attributeSet", "join_between_product_and_attribute");
if (!attributes.isEmpty()) {
Set<String> attributeIds = new HashSet<>();
for (Attribute attribute : attributeList) {
attributeIds.add(attribute.getId());
}
criteria.add(Restrictions.in("id", attributeIds));
}
criteria = criteria.createCriteria("optionValue", "join_between_attribute_optionvalue");
if (!optionValueList.isEmpty()) {
criteria.add(Restrictions.in("id", optionValueList));
}
关于java - Hibernate 条件连接表问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43664653/