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

使用以下代码我可以成功检索用户的地址字段,为此,我需要使用Projection定义其所有字段。 想象地址有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); 

我也使用了以下内容但它遇到错误(无法解析属性:addr of:com.myProject.User)

  pl.add(Projections.property("addr").as("address")); 

Java的

 @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)); 

如果从查询中提取的结果将与您定义的DAO的字段匹配。 我只是从hql或本机SQL查询中输入结果。

 Select * From Address a where a.id = :userid 

地址addrObject =(Address)query.uniqueResult();

这样做

  Criteria criteria = session.createCriteria(User.class, "user") .createAlias("user.address", "addr") .add(Restrictions.eq("user.id", userId)) .setProjection(Projections.property("addr")); Address address = (Address) criteria.list().get(0); 

几种选择:

  1. 对地址对象使用lazy =“false”。 如果由于某种原因必须使用lazy = true,则可以在单独的会话中运行此查询并覆盖该会话中的延迟行为。
  2. 使用特定于数据库的查询获取字段名称列表,然后通过循环字段名称动态生成预测。

例如,在mysql中

 SHOW COLUMNS FROM Address 

在postgres

 SELECT * FROM information_schema.columns WHERE table_schema = your_schema AND table_name = your_table 

我希望这有帮助。