将SQL转换为冬眠标准



我正在编写一种方法,用于检索其订单总和(订单。任务)高且小于输入值的方法。

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的输入参数列表时,您可以了解更多此错误的含义。解决方案是您需要将大列表拆分为较小的列表,或优化您的SQL查询以使其具有小于小于参数大小有限。

您必须通过将列表分配到小于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));
        }

相关内容

  • 没有找到相关文章

最新更新