我的实体模型类
------- 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 ????
答案 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:它更具可读性和更强大。