在Hibernate中是否可以(以及如何)创建与命名查询的关联?

时间:2013-11-11 16:02:01

标签: java mysql hibernate

这是关于将计算列干净地映射到Hibernate中的实体。我有一个复杂的SQL查询,它创建一个具有计算列的视图。一个简单的版本说明如下avg函数调用将是一堆粗糙的SQL ...

CREATE VIEW `Complex` AS
select
    `p`.`parentId` AS `complexId`,
    avg(`t1`.`someColumn`) AS `complexColumn`
from
    (`Parent` `p`
    join `Table1` `t1` ON ((`p`.`parentId` = `t1`.`table1Id`)))
group by `p`.`parentId`

Complex中有一个实体类,用于返回由complexId加入的Parent的关联:

 @Entity
 public class Parent {
 ...
 @OneToOne
 @PrimaryKeyJoinColumn(name = "complexId")
 private Complex complex;
...

任何返回Parent的集合查询,都会很好地返回包含计算列的关联视图的结果。

这里的问题是,是否有一种方法可以通过编写没有视图的复杂查询来创建同一个关联,例如作为命名的hibernate查询并保持Parent与Complex之间的关联原样?

造成这种情况的原因是由于MySql中有关参数和子查询的视图的限制,如果这可以在非面向视图的查询中表示,则可以避免这些限制。

1 个答案:

答案 0 :(得分:0)

您的SQL有多复杂? Hibernate有可能是@Formula:

public class Parent{

@Formula("select avg(xyz) from some_table where parent_id = ?")
private BigDecimal average;


}

Hibernate也支持过滤器,这些过滤器被描述为:

  

与数据库视图类似,但它们在内部参数化   应用

http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/filters.html