内连接完整实体类字段的Hibernate Criteria

时间:2011-08-24 14:12:19

标签: hibernate criteria-api

我的实体模型类

------- A -----------
private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(name = "NameA")
    private String nameA;

    public B getBid() {
        return b;
    }

    public void setBid(B bid) {
        this.b = bid;
    }

    public String getNameA() {
        return nameA;
    }

    public void setNameA(String nameA) {
        this.nameA = nameA;
    }
    @JoinColumn(name = "BID", referencedColumnName = "ID")
    @ManyToOne(fetch= FetchType.LAZY)
    private B b;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }
--------------------------------------------
------------------ B -----------------------

private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(name = "NameB")
    private String nameB;


    public String getNameB() {
        return nameB;
    }

    public void setNameB(String nameB) {
        this.nameB = nameB;
    }


    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

和 我想要 进行此查询session.createQuery("select a.b from A a").list();

使用Criteria API ????

1 个答案:

答案 0 :(得分:1)

由于您没有反向关系,并且由于Criteria不允许选择除根实体之外的其他实体,因此您必须使用子查询,但这很难看:

DetachedCriteria subquery = DetachedCriteria.forClass(A.class, "a");
subquery.createAlias("a.b", "b2");
subquery.setProjection(Projections.property("b2.id"));

Criteria c = session.createCriteria(B.class, "b1");
c.add(Subqueries.propertyIn("b1.id", subquery));

如果你有从B到A的反向OneToMany关系,你只需要做

Criteria c = session.createCriteria(B.class, "b1");
c.createAlias("b1.as", "a");
BTW,这些非动态构造的查询使用HQL比使用条件API更好地表达。如果您的真实查询是您提出的查询,请使用HQL:它更具可读性和更强大。

相关问题