将 SQL 转换为 Hibernate 标准
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
: Prepared or callable statement has more than 2000 parameter markers`.
当输入参数列表不能超过 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));
}
我正在编写一种方法来检索订单总和 (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
: Prepared or callable statement has more than 2000 parameter markers`.
当输入参数列表不能超过 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));
}