Hibernate Native SQL Query检索实体和集合

这是我的情况,我有两个基本的POJO,我已经给出了一个简单的hibernate映射:

Person - PersonId - Name - Books Book - Code - Description 

我的SQL查询返回如下所示的行:

 PERSONID NAME CODE DESCRIPTION -------- ---------- ---- ----------- 1 BEN 1234 BOOK 1 1 BEN 5678 BOOK 2 2 JOHN 9012 BOOK 3 

我的hibernate查询如下所示:

 session.createSQLQuery("select personid, name, code, description from person_books") .addEntity("person", Person.class) .addJoin("book", "person.books") .list(); 

这是每节:18.1.3的hibernate文档: http : //docs.jboss.org/hibernate/core/3.6/reference/en-US/html/querysql.html#d0e17464

我希望在我的列表中得到的是2个人对象,其中包含书籍集合中包含的书籍对象:

 List |- Ben | |- Book 1 | '- Book 2 '- John '- Book 3 

我实际看到的是:

 List |- Object[] | |- Ben | | |- Book 1 | | '- Book 2 | '- Book 1 |- Object[] | |- Ben | | |- Book 1 | | '- Book 2 | '- Book 2 '- Object[] |- John | '- Book 3 '- Book 3 

有谁知道使用这种方法是否有可能得到我想要的东西?

扩展Mathews的答案。 强制hibernate只返回一个人列表:

 List peopleWithBooks = session.createSQLQuery( "select {p.*}, {b.*} from person p, book b where "). .addEntity("p", Person.class) .addJoin("b", "p.books") .addEntity("p", Person.class) .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY) .list(); 

无需额外调用db即可获取和初始化关联的Book实体。

重复

  .addEntity("p", Person.class) 

是必要的,因为

  .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY) 

对最后添加的实体进行操作。

以下为我工作:

 session.createSQLQuery("select p.*, b.* from person p, book b where "). .addEntity("person", Person.class).addJoin("book", "person.books").list(); 

这将返回一个包含Person列表的Object[] ,每个Person都包含Book的列表。 它在单个SQL选择中执行此操作。 我认为你的问题是你没有专门为别人做任何事。

编辑:该方法返回一个Object [],但该数组使用Person实例填充,并且只填充Person实例。

如果Hibernate不了解如何映射到您的类,或者它无法理解如何映射连接,它将返回一个对象列表。 确保每行只有一个Person / Book组合。

HHH-2831使用addJoin或返回对象数组而不是单个实体的本机SQL查询

此行为是由已知错误引起的。 Doh,应该更加努力!

您的查询应该在person表而不是person_books吗?

 session.createSQLQuery("select * from person") .addEntity("person", Person.class) .addJoin("book", "person.books") .list(); 

AFAIK,无法从SQL查询中获取“合并”实体。 您将只返回一个对象数组。 我在这种情况下做的是我为我的合并实体创建了一个新的构造函数,它接受了一个对象数组作为它的参数。 然后我手动构建了它。