私は私がかなり簡単であるべきだと思う何かを達成するのに非常に困難を抱えています。
基本的に、私はOrderBeanとOrderInsertBeanを持っています。これらは両方ともmySQLテーブルにマップされたエンティティです。OrderBeanには複数のOrderInsertBeanを含めることができ、OrderInsertBeanには1つのOrderBeanしかありません。
これらのテーブルから結果を検索して並べ替える動的クエリを構築するために、HibernateCriteriaクエリを作成しています。次のOrderInsertBeanで注文を並べ替えようとしている場合を除いて、ほとんど正常に機能します。
ご覧のとおり、OrderInsertBeanにはinsertDateがあり、各Orderについて、insertDateが今日よりも大きい最初のOrderInsertを選択し、この日付で注文を並べ替えます。
プレーンSQLでは十分に簡単です。複数の方法で書くことができますが、これはそれを行う1つの方法です。
select o.*, (select min(oi2.insertDate)
from AIDA_ORDER_INSERT oi2 where oi2.insertDate > curdate()
and oi2.orderId = o.orderId) as insertDateNew
from AIDA_ORDER o
order by insertDateNew
しかし、*これをHibernate Criteriaクエリのようにどのように書くことができますか?または、JPA 2CriteriaQueryも適しています。
これは私が得た限りです...
Criteria crit = session.createCriteria(OrderBean.class, "order");
DetachedCriteria subquery = DetachedCriteria.forClass(OrderInsertBean.class, "oi");
subquery.add(Restrictions.ge("oi.insertDate", new Date()));
ProjectionList projectionList = Projections.projectionList();
projectionList.add(Projections.min("oi.insertDate"));
projectionList.add(Projections.groupProperty("oi.orderId"));
subquery.setProjection(projectionList);
// How to add the subquery to the main query to get the desired results??
// Finally ordering the results:
crit.addOrder(Order.asc("insertDateNew"));
私が必要としているのは、どういうわけかサブクエリを条件選択リストに追加し、それにエイリアスを付けてから、それで並べ替えることだと思います...
しかし、私は立ち往生していて、どこに行くべきかわかりません。誰かが貧しい仲間を助けることができますか?
ありがとう