java - Hibernate 条件连接表问题

标签 java hibernate hibernate-criteria jointable

我有 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/

相关文章:

java - MongoDB Java驱动程序读取结果时无限循环

java - 如果我有太多空行,则单词显示的问题

java - 在 hibernate 选择中创建对象

java - 如何在 hibernate 条件中转换列数据类型?

java - Hibernate 5 无法比较字符串和 int

java - Hibernate Criteria Api 是否完全防止 SQL 注入(inject)

java - testCompile的“Unresolved reference:”错误

java - 如何将整列的大小写更改为小写?

hibernate - 我可以在 withTransaction 闭包内提交吗

MySQL utf8mb4 unicode(笑)