Hibernateの基準API-このように収して大きさはどれくらいですか?
-
12-09-2019 - |
質問
仮に私の授業ユーザーとUserGroup.どうぞお気軽にお問い合わせく1-数多くのグループのユーザー協会、協会はマップの両面からのUserGroup側を介して物件"会員"とは、HashSetのユーザー側の通財産"は同一ではありません。
の基準APIたいのですがクエリのすべてのグループソートされる数のグループです。
(Edit)について指摘が聞このページ位置を示していた、ということがあげらのSQLでのご注文もなされるべきである、SQLが可能です。
解決
別のオプションは、基本的に、あなたのカウントで得ることができるので、選択入れ子に作成するのと同じです@Formulaアノテーションを使用することです。
あなたのDBには、のようなゲッターに注釈を追加する(ユーザーが作成する必要があります)問題のプロパティ/メンバーオブジェクトます:
( "何でも...)TABLE FROM(SELECT COUNT(TABLE_NAME.ID)")@Formula 公共長いgetNewProperty { newPropertyを返します。 }
次に、あなたのカウント値のホールドを取得するには、直接メンバーをターゲット...
注:式の注釈内のSQLを指定するときに、現在のオブジェクトテーブルを参照するとき、あなたはこの自体に休止取引として(この)直接フィールド名を指定しなければならないことに注意してください。だから、あなたの中にWHERE句は、単にIDまたは自分自身でどのような現在のオブジェクトテーブルを参照するとき、私はUserGroupにある疑いがどれを使用します。
私は仕事と文句を言うから、コンパイラを防ぐために冬眠ために私の新しいプロパティのセッターを持っていた。
があり@Formulaを使用して、他の巧妙な方法であることが、私はこれに非常に新しいですし、主題に非常に多くの文書があるように思われないことがあります...
あなたは、ネストされたSELECTS前に使用したことがない場合、それはあなただけの最初のSQLで再現するためのアイデアかもしれない - 。私を助けている。
ホープ、このことができます。
他のヒント
はできないのでデフォルトで使用Citeria APIができます。hibernate.評価のポイントになります。注文クラスです。だからこそ、なかなか見れないが分かるクラス: http://blog.tremend.ro/2008/06/10/how-to-order-by-a-custom-sql-formulaexpression-when-using-hibernate-criteria-api
私sollutionは:
public class SizeOrder extends Order {
protected String propertyName;
protected boolean ascending;
protected SizeOrder(String propertyName, boolean ascending) {
super(propertyName, ascending);
this.propertyName = propertyName;
this.ascending = ascending;
}
public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException {
String role = criteriaQuery.getEntityName(criteria, propertyName) + '.' + criteriaQuery.getPropertyName(propertyName);
QueryableCollection cp = (QueryableCollection) criteriaQuery.getFactory().getCollectionPersister(role);
String[] fk = cp.getKeyColumnNames();
String[] pk = ((Loadable) cp.getOwnerEntityPersister())
.getIdentifierColumnNames();
return " (select count(*) from " + cp.getTableName() + " where "
+ new ConditionFragment()
.setTableAlias(
criteriaQuery.getSQLAlias(criteria, propertyName)
).setCondition(pk, fk)
.toFragmentString() + ") "
+ (ascending ? "asc" : "desc");
}
public static SizeOrder asc(String propertyName) {
return new SizeOrder(propertyName, true);
}
public static SizeOrder desc(String propertyName) {
return new SizeOrder(propertyName, false);
}
}
のtoSqlStringの方法は、org.hibernate.評価のポイントになります。SizeExpressionクラスです。(出典: http://javasourcecode.org/html/open-source/hibernate/hibernate-3.6.0.Final/org/hibernate/criterion/SizeExpression.java.html)
使用例:
hibernateSession.createCriteria(UserGroup.class).addOrder( SizeOrder.asc("members") ).list();
このリストユーザーグループの命によりサイズの上昇は、"会員"とは、ユーザーコレクションUserGroupる。
あなたは、おそらくので、これをそのエンティティ内のコレクションのサイズを返す読み取り専用のプロパティになりますあなたのエンティティの「派生プロパティ」を、定義することでした。派生プロパティを定義する最も簡単な方法は、ですここを文書化します:
デフォルト -更新は、(オプションを挿入します 真):マッピングされたことを指定します 列は、SQLに含まれるべきです UPDATEおよび/またはINSERT文。 falseに両方を設定すると、純粋することができます その値が「導出」プロパティがあります 他のいくつかのプロパティから初期化 それは、同じカラムにマッピング、またはによって トリガや他のアプリケーションます。
プロパティが定義されたら、あなただけの他のプロパティと同じように、基準のAPIにおける順序句としてプロパティ名を使用することができるはずです。私自身は、しかし、これを試していません。
それが動作する場合は、SQLにマップすることはできませんので、、それはおそらく、インメモリの一種として行われます。これは問題がある場合には、書類上の同じリンクがカスタムSQLフラグメントを使用して派生プロパティを実装する方法:
の強力な機能が導出されます プロパティ。これらのプロパティは、です 定義は読み取り専用です。プロパティ 値は、ロード時に計算されます。君は SQLとして計算を宣言する 表現。これは、その後に変換します SQLのSELECT句のサブクエリ インスタンスをロードクエリます: