1

这是关于将计算列干净地映射到 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 的集合查询都会很好地返回具有计算列的关联视图的结果。

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

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

4

1 回答 1

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

于 2013-11-11T16:13:58.567 回答