使用以下代码,我可以成功检索用户的地址字段,为此,我需要使用Projection定义其所有字段。想象地址有100个字段,在这种情况下,我必须定义所有字段。
我想知道是否可以仅返回客户的地址对象而不在Proposition中定义其所有字段吗?
我知道我可以检索地址的ID并使用它来检索其对象,但是我想知道是否还有其他方法而不是此方法或定义其所有字段。
hibernate
..... Criteria cre = session.createCriteria(User.class, "user") .createAlias("user.address", "addr"); cre.add(Restrictions.eq("user.id", ID)); ProjectionList pl = Projections.projectionList(); pl.add(Projections.property("addr.id").as("id")); pl.add(Projections.property("addr.unit").as("unit")); ....... cre.setProjection(pl); Address address = (Address) cre.list().get(0);
我也使用了以下内容,但遇到错误 (无法解析属性:com.myProject.User的地址)
pl.add(Projections.property("addr").as("address"));
爪哇
@Entity public Class User { @Id @GeneratedValue private long id; @OneToOne private Address address; ... }
使用JPQL / HQL:
select a from User u join u.address a where u.id = :userId
Criteria API比JPQL更为受限制,除根实体外不能选择任何其他实体。如果查询不是必须动态组成的,则不应使用它。当然,如果关联是双向的,则可以简单地使用
select a from Address a where a.user.id = :userId
或其等效标准:
Criteria c = session.createCriteria(Address.class, "a"); c.createAlias("a.user", "u"); c.add(Restrictions.eq("u.id", userId));