一尘不染

如何使用Hibernate检索类的成员对象?

hibernate

使用以下代码,我可以成功检索用户的地址字段,为此,我需要使用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;

     ...
}

阅读 223

收藏
2020-06-20

共1个答案

一尘不染

使用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));
2020-06-20