0

我有一堂这样的课:

public class BookAuthor {

  private Book book;
  private Author author;
}

Book 和 Author 被定义为实体。

当我尝试检索数据时,这样:

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,然后迭代结果以获取有关作者和书籍的信息。也就是说,在我的日志中,会有这样的东西:

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;

我认为作者和书籍之间没有数据库约束(这只是实际实体的一个示例,但假设可能有一些没有作者的匿名书籍)。感谢 JB Nizet,稍后我将检索查询并在此处发布。

4

2 回答 2

0

您不应该将休眠查询视为 SQL 查询。我猜你想要的是休眠延迟加载:

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

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

于 2013-05-09T12:51:36.333 回答
0

通常的情况是当您想要创建项目列表时。在这种情况下,您知道您感兴趣的领域。所以你在你的投影中指定那些(在 SQL 中的 SELECT 子句)。

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

不同之处在于您现在将返回 Object[] 实例的列表。Hibernate 将把解组为实体的工作留给您。

于 2013-05-09T22:32:04.937 回答