簡體   English   中英

將 sql 轉換為休眠條件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM