Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate本机SQL查询检索实体和集合_Java_Hibernate_Native Sql - Fatal编程技术网

Java Hibernate本机SQL查询检索实体和集合

Java Hibernate本机SQL查询检索实体和集合,java,hibernate,native-sql,Java,Hibernate,Native Sql,这就是我的情况,我有两个基本的POJO,我已经给出了一个简单的hibernate映射: Person - PersonId - Name - Books Book - Code - Description 我的SQL查询返回如下所示的行: 我的hibernate查询如下所示: session.createSQLQuery("select personid, name, code, description from person_books") .add

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

Person
  - PersonId
  - Name
  - Books

Book
  - Code
  - Description
我的SQL查询返回如下所示的行:

我的hibernate查询如下所示:

session.createSQLQuery("select personid, name, code, description from person_books")  
       .addEntity("person", Person.class)
       .addJoin("book", "person.books")
       .list();
这是根据hibernate文档的第18.1.3节:

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

我实际上看到的是:


有人知道使用这种方法是否可以得到我想要的吗?

您的查询应该在person表上而不是person book上吗

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

以下是我的作品:

session.createSQLQuery("select p.*, b.* from person p, book b where <complicated join>").
.addEntity("person", Person.class).addJoin("book", "person.books").list();
session.createSQLQuery(“从person p,book b where中选择p.*,b.*”)。
.addEntity(“person”,person.class).addJoin(“book”,“person.books”).list();
这将返回一个
对象[]
,其中包含一个
人的列表,每个人都包含一个
书的列表。它在一个SQL选择中完成这一操作。我认为你们的问题在于你们并没有特别地在任何事情上给某人加上别名

编辑:该方法返回一个对象[],但数组中填充了Person实例,并且只填充了Person实例

如果Hibernate不知道如何映射到类,或者不知道如何映射联接,它将返回一个对象列表。确保每行只有一个
/
组合。


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

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

在Mathews答案上展开。 要强制hibernate仅返回人员列表,请执行以下操作:

List<Person> peopleWithBooks = session.createSQLQuery(
   "select {p.*}, {b.*} from person p, book b where <complicated join>").
     .addEntity("p", Person.class)
     .addJoin("b", "p.books")
     .addEntity("p", Person.class)
     .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
     .list();
是必要的,因为

 .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)

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

为了简洁起见,我简化了这个示例。在我的实际使用中,“person_books”是一个复杂的查询,如果我不在查询中提供信息,hibernate无法获取“book”的信息。我正在为Person检索大量的行,我希望不必执行额外的查询来查找每个人的书籍。如果我找不到解决方案,我可能会使用此方法,但只是跳过人员不变的行。我所期望的是人员列表,而不是包含重复人员的对象[]列表,当他们拥有多本书时。有关hibernate jira bug报告的链接,请参见我的答案。抱歉,我要澄清的是,该方法返回一个对象[],但数组中填充了Person,并且只有Person。我没有任何书在里面。这可以为个人和书取所有的东西。如果只想选择某些属性以提高性能,该怎么办。据我所知,除了*或p.*之外的任何东西都不起作用。使用
{p.*},{b.*}
还修复了
书籍
的附加子选择问题。无论与一个人相关联的书籍数量如何,这是否每人只能获取一本书?我有一个类似的问题,并使用此解决方案。它返回“联接”实体的集合,但不返回其中的所有值。设置大小为1。使用duplicate
。addEntity
的解决方法帮助了我。我发现这个问题后,发布了另一个建议类似的问题-更新:更正链接@ehrhardt answer修复了Hibernate 5.1的此问题:
session.createSQLQuery("select p.*, b.* from person p, book b where <complicated join>").
.addEntity("person", Person.class).addJoin("book", "person.books").list();
List<Person> peopleWithBooks = session.createSQLQuery(
   "select {p.*}, {b.*} from person p, book b where <complicated join>").
     .addEntity("p", Person.class)
     .addJoin("b", "p.books")
     .addEntity("p", Person.class)
     .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
     .list();
 .addEntity("p", Person.class)
 .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)