1

これは、計算された列を Hibernate のエンティティにきれいにマッピングすることに関するものです。計算列を持つビューを作成する複雑な SQL クエリがあります。説明するための簡単なバージョンを以下に示します。ここでは、平均関数呼び出しがザラザラした 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`

complexId によって結合された Parent への関連付けで使用される Complex のエンティティ クラスがあります。

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

Parent を返すコレクション クエリは、計算された列を持つ関連付けられたビューの結果を適切に返します。

ここでの問題は、ビューなしで複雑なクエリを作成することによって、この同じ関連付けを作成する方法があるかどうかです。

この理由は、パラメータとサブクエリに関する 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 に答える