[英]Transform sql to hibernate criteria
我正在編寫一種方法來檢索客戶的訂單總和 (order.total) 高於和低於輸入值。
Criteria criteria = DetachedCriteria.forClass(Clients.class, "cl");
if (clOrdsTtlPrcFrom != -1 && clOrdsTtlPrcTo != -1) {
String sql = "select OwnerID from Orders group by OwnerID having sum(Total) >= :clOrdsTtlPrcFrom and sum(Total) <= :clOrdsTtlPrcTo";
SQLQuery query = sess.createSQLQuery(sql).addScalar("OwnerID", LongType.INSTANCE);
query.setParameter("clOrdsTtlPrcFrom", clOrdsTtlPrcFrom);
query.setParameter("clOrdsTtlPrcTo", clOrdsTtlPrcTo);
criteria.add(Restrictions.in("id", query.list()));
}
Criteria criteria2 = sess.createCriteria(Clients.class);
criteria2.add(Subqueries.propertyIn("id", criteria));
List<Clients> clients = (List<Clients>) criteria2.list();
一切正常,但是,有時我會收到錯誤消息:
java.sql.SQLException: Prepared or callable statement has more than 2000 parameter markers.
我怎樣才能更正這種方法,或者,也許,以完整的標准樣式轉換它?
java.sql.SQLException
: 准備好的或可調用的語句有超過 2000 個參數標記`。
當輸入參數列表不能超過 2000 時,您可以了解更多此錯誤的含義。參數。
您必須通過將列表分成大小小於 2000 的小列表來解決此問題,然后對每個較小的列表運行查詢。 然后再次將結果合並到一個列表中。 現在您可以按照您想要的方式對列表進行分區。
最后,我通過這種方式解決了這個問題,使用sql限制:
DetachedCriteria dtcrt = DetachedCriteria.forClass(Clients.class);
dtcrt.setProjection(Projections.distinct(Projections.id()));
if (clOrdsTtlPrcFrom != -1 && clOrdsTtlPrcTo != -1) {
dtcrt.add(Restrictions.sqlRestriction("OwnerID in(select OwnerID from Orders group by " +
"OwnerID having sum(Total) >= ? and sum(Total) <= ?)", new Integer[]{clOrdsTtlPrcFrom, clOrdsTtlPrcTo},
new Type[]{StandardBasicTypes.INTEGER, StandardBasicTypes.INTEGER}));
criteria.add(Subqueries.propertyIn("id", dtcrt));
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.