我有一个这样的课程:
public class BookAuthor {
private Book book;
private Author 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,我将检索查询并在此处发布。
答案 0 :(得分:0)
您不应将hibernate查询视为SQL查询。我想你所追求的是休眠加载:
如果您获取BookAuthor并且属性Book and Author是延迟加载的,那么它将会很慢(因为hibernate必须为一个实体总共生成3个Querys)
因此,根据您的情况,您可以在映射中禁用BookAuthor的延迟加载 - 然后hibernate会在一个选择查询中获取所有数据。
答案 1 :(得分:0)
通常情况下,您要创建项目列表。在这种情况下,您知道您感兴趣的字段。因此,在投影中指定它们(在SQL中为SELECT子句)。
你是如何建议做的很好。一旦你有关系映射,Hibernate会在一个连接中完成它,因为你指定了一个Projection列表。
不同之处在于您现在将返回Object []实例列表。 Hibernate会将解组留给你实体。