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

Java 如何使用Hibernate检索类的成员对象?,java,hibernate,hibernate-mapping,Java,Hibernate,Hibernate Mapping,使用以下代码,我可以成功地检索用户的地址字段,为此,我需要使用投影定义其所有字段。假设address有100个字段,在这种情况下,我必须定义所有字段 我想知道我是否可以只返回客户的address对象,而不在Proposition中定义其所有字段 我知道我可以检索地址的id并使用它来检索它的对象,但我想知道是否有其他方法可以代替这个或定义它的所有字段 休眠 ..... Criteria cre = session.createCriteria(Use

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

我想知道我是否可以只返回客户的address对象,而不在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)

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
Address 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);
两种选择:

  • 对地址对象使用lazy=“false”。如果出于某种原因必须使用lazy=true,则可以在单独的会话中运行此查询,并覆盖该会话中的懒惰行为
  • 使用特定于数据库的查询获取字段名列表,然后通过循环字段名动态生成投影
  • 比如说,, 在mysql中

    SHOW COLUMNS FROM Address
    
    博士后

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

    我希望这能有所帮助。

    如果我使用JPQL,它会与hibernate的事务冲突吗?请也看看我的另一个问题,谢谢不,当然不会。JPQL/HQL是执行JPA/Hibernate查询的首选方式。条件对于动态组合查询很有用。
    SELECT * FROM information_schema.columns
    WHERE table_schema = your_schema
    AND table_name   = your_table