Hibernate:在一个类中聚合两个实体,用一个HQL查询检索数据

Hibernate:在一个类中聚合两个实体,用一个HQL查询检索数据,hibernate,hql,Hibernate,Hql,我有一门课是这样的: public class BookAuthor { private Book book; private Author author; } select a.ID, b.ID from authors a , books b 书和作者被定义为实体 当我尝试检索数据时,以下方法: final String selectCols = "NEW BookAuthor(b,a)"; final org.hibernate.Query q = createQuery(s

我有一门课是这样的:

public class BookAuthor {

  private Book book;
  private Author author;
}
select a.ID, b.ID
from authors a , books b
书和作者被定义为实体

当我尝试检索数据时,以下方法:

final String selectCols = "NEW BookAuthor(b,a)";
final org.hibernate.Query q = createQuery(selectCols, params, filters);
result = q.list();
return result;
当Hibernate执行“q.list()”时,它执行一个查询来检索书籍和作者的ID,然后迭代结果以获取关于作者和书籍的信息。也就是说,在我的日志中,会有如下内容:

public class BookAuthor {

  private Book book;
  private Author author;
}
select a.ID, b.ID
from authors a , books b
然后针对每一行:

select a.ID, a.name
where a.ID = ?

select b.ID, b.title
where b.ID = ?
有没有一种方法可以让Hibernate通过一个查询获得结果,从而提高这样的性能

select a.ID, a.name, b.ID, b.title
from authors a , books b
提前谢谢

编辑:

实体是根据其表和列名定义的,如:

public static final String TABLE_NAME = "AUTHOR";
@Column(name = "id", nullable = false)
protected Long id;
我认为author和book之间并没有DB约束(这只是实际实体的一个示例,但假设可能有一些匿名书籍并没有作者)。
谢谢,我将检索查询并稍后发布到这里。

您不应该将hibernate查询视为SQL查询。我想你想要的是休眠惰性加载:

如果您获取BookAuthor,并且Book和Author属性是延迟加载的,那么加载速度会很慢(因为hibernate必须为一个实体总共进行3次查询)


因此,根据您的情况,您可以在映射中禁用BookAuthor的延迟加载-然后hibernate将在一个select查询中获取所有数据。

通常情况下,您需要创建项目列表。在这种情况下,您知道哪些字段是您感兴趣的。因此,您可以在投影中指定它们(在SQL的SELECT子句中)

你建议怎么做很好。一旦映射了关系,Hibernate将在一个连接中完成,因为您正在指定一个投影列表


不同之处在于,现在您将返回对象[]实例的列表。Hibernate将把解组分为实体留给您。

实体是如何定义的?您正在执行的查询是什么?为什么不选择所有的书,或者所有的作者,并使用他们之间的关联来获得作者(或者书)?我赞成这个回答,但我最终无法使用包含两个实体的类的方法。我总是执行许多SQL查询。我刚刚将select语句更改为如下内容:选择新映射(a.ID、a.name、b.ID、b.title),然后将结果映射到类属性中。这不是一个优雅的解决方案,但至少它起了作用。