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查询中获取“合并”实体。 您将只返回一个对象数组。 我在这种情况下做的是我为我的合并实体创建了一个新的构造函数,它接受了一个对象数组作为它的参数。 然后我手动构建了它。
- 如何在hibernate上指定Double的精度?
- Hibernate拦截器和事件监听器
- 重写持久化实体的hashCode()和equals()方法的正确方法是什么?
- 处理遗留数据库时,Hibernate会对丢失的行进行扼流
- 嵌套事务用例中的外部事务没有看到数据库中持久存在的更新(JPA,MySQL,Spring Framework和Hibernate)
- Spring数据和mongodb – 在@Transactional中简单回滚弹簧
- UnknownEntityTypeException:无法找到persister(Hibernate 5.0)
- 线程“main”中的exceptionorg.hibernate.HibernateException:访问stax流时出错
- 具有额外连接条件的JPA @JoinTable