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

J88*_*888 3 java hibernate hibernate-mapping

使用以下代码,我可以成功检索用户的地址字段,为此我需要使用 Projection 定义其所有字段。想象一下 address 有 100 个字段,在这种情况下,我必须定义所有字段。

我想知道是否可以只返回客户的地址对象而无需在 Proposition 中定义其所有字段?

我知道我可以检索地址的 id 并使用它来检索它的对象,但我想知道是否还有其他方法而不是这个方法或定义它的所有字段。

休眠

            .....
            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);
Run Code Online (Sandbox Code Playgroud)

我也使用了以下内容,但遇到了错误(无法解析属性:com.myProject.User 的地址)

    pl.add(Projections.property("addr").as("address"));
Run Code Online (Sandbox Code Playgroud)

爪哇

@Entity
public Class User {

     @Id
     @GeneratedValue
     private long id;

     @OneToOne
     private Address address;

     ...
}
Run Code Online (Sandbox Code Playgroud)

JB *_*zet 5

使用 JPQL/HQL:

select a from User u join u.address a where u.id = :userId
Run Code Online (Sandbox Code Playgroud)

Criteria API 比 JPQL 更受限制,并且不能选择除根实体之外的任何其他实体。如果查询不必动态组合,则不应使用它。当然,如果关联是双向的,你可以简单地使用

select a from Address a where a.user.id = :userId
Run Code Online (Sandbox Code Playgroud)

或其等效标准:

Criteria c = session.createCriteria(Address.class, "a");
c.createAlias("a.user", "u");
c.add(Restrictions.eq("u.id", userId));
Run Code Online (Sandbox Code Playgroud)