-1

我正在编写一种方法来检索订单总和(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.

我怎样才能纠正这个方法,或者,也许,把它转换成完整的标准风格?

4

2 回答 2

1

java.sql.SQLException: 准备好的或可调用的语句有超过 2000 个参数标记`。

当您的输入参数列表不能超过 2000 时,您可以了解更多此错误的含义。解决方案是您需要将大列表拆分为较小的列表,或者优化您的 SQL 查询以使其小于限制的大小参数。

您必须通过将列表划分为大小小于 2000 的小列表来解决此问题,然后为每个较小的列表运行查询。然后再次将结果合并到一个列表中。现在您可以按照您想要的方式对列表进行分区。

于 2017-12-29T12:34:31.727 回答
0

最后,我通过这种方式解决了这个问题,使用 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));
        }
于 2018-01-02T10:24:35.703 回答