Hibernate的自定义连接条款多对一

时间:2011-10-13 10:04:13

标签: hibernate

在检索给定实体的关联时,是否可以定制hibernate执行的查询?更具体地说,我想为join子句添加一个额外的条件,以满足我正在使用的遗留数据库中的设计缺陷。

我面临的问题如下。 表格b 的主键包含2个字段,类别idvalue_id。但是在表A 中,我只存储了value_id,并且假设类别ID是硬编码的:

@Entity
@Table(name = "table_a")
public class A {
   @ManyToOne
   @JoinColumn(name = "b_id")
   private B b;
}

@Entity
@Table(name = "table_b")
public class B {
   @Id
   private int id;
}

当查询A的实例时,hibernate会生成以下连接子句:

SELECT *
FROM table_a a LEFT OUTER JOIN table_b b
  ON a_.b_id = b_.value_id

他们查询我要求它执行的是:

SELECT *
FROM table_a a LEFT OUTER JOIN table_b b
  ON a_.b_id = b_.value_id
 AND b.category_id = 2

我知道我可以使用视图来解决这个问题,但是如果可能的话,我需要创建大约70个视图,我希望避免这些视图。

2 个答案:

答案 0 :(得分:1)

我解决了这个问题。这不是最漂亮的解决方案,而是唯一有效的解决方案。

基本上我必须这样做:

  1. 将Embbeded ID模拟为A类
  2. 在A之间建立联接 - > B使用真实键列和categoryId比较公式
  3. 像这样:

    Obs:我没有测试这段代码,只是改编自我的。

    @Entity
    @Table(name = "table_a")
    public class A {
       @ManyToOne(fetch=FetchType.LAZY)
       @JoinColumnsOrFormulas(value={
            @JoinColumnOrFormula(column=
                    @JoinColumn(name="B_ID", referencedColumnName="B_ID")),
            @JoinColumnOrFormula(formula=
                    @JoinFormula(referencedColumnName="CATEGORY_ID", 
                            value = "(SELECT 2 from DUAL)"))}) //I am using Oracle
       @JoinColumn(name = "b_id")
       private B b;
    }
    
    @Entity
    @Table(name = "table_b")
    class B {
       @Id
       private BId id;
    }
    
    @Embeddable
    class BId{
        private int id;
        private Integer categoryId;
    }
    

答案 1 :(得分:0)

您可以使用:

@OneToMany(mappedBy = "b")
@Cascade(CascadeType.ALL)
private List<A> aList = new ArrayList<A>(0);
<{1>}在class B上获取加入和命名查询以获取category_id(也在class B

@NamedQueries({
@NamedQuery(name = "B.findByCategoryId", query = "SELECT b FROM B b WHERE b.Id = :categoryId")
})