2

Hibernate での制限の使用について質問があります。

基準を作成し、いくつかの制限を設定してから、日付フィールドの最大値を持つ 1 つのレコードを選択する必要があります。

Criteria query = session.createCriteria(Storage.class)
           query.add(Restrictions.eq(USER_ID, item.getUserId()));
           query.add(Restrictions.eq(ITEM_ID, item.getItemId()));
           query.add(Restrictions.lt(PURCHASE_DATE, item.getDate()));
           query.setProjection(Projections.max(PURCHASE_DATE));
           return query.uniqueResult();

プロジェクションが最大日付のレコードを返さないことを理解しています。どのアプローチを選択すればよいですか?

クエリに順序を追加して (日付フィールドの昇順)、最初の結果を選択することはできますか?

または、よりエレガントなソリューションを提案していただけますか?

ありがとうございました!

4

1 に答える 1

7

あなたの場合、あなたは行くことができます

A) DetachedQuery を使用。例えば、

DetachedCriteria maxQuery = DetachedCriteria.forClass( Storage.class );
maxQuery.add(Restrictions.eq(USER_ID, item.getUserId()));
maxQuery.add(Restrictions.eq(ITEM_ID, item.getItemId()));
maxQuery.add(Restrictions.lt(PURCHASE_DATE, item.getDate()));
maxQuery.setProjection( Projections.max( "PURCHASE_DATE" ) );

Criteria query = getSession().createCriteria( Storage.class );
query.add(Restrictions.eq(USER_ID, item.getUserId()));
query.add(Restrictions.eq(ITEM_ID, item.getItemId()));
query.add( Property.forName( "PURCHASE_DATE" ).eq( maxQuery ) );

切り離されたクエリを扱うときは、トランザクションを念頭に置いてください。

切り離されたクエリの詳細については、ドキュメントの第 15 章を参照してください: http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/querycriteria.html

B) 副選択を行うために、HQL または SQL を直接使用します。

HQL の詳細については、Hibernate ドキュメントの第 14 章を参照してください: http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/queryhql.html

于 2014-01-19T11:48:41.963 に答える