错误的分区列表 "maximum number of expressions in a list is 1000"
partition list for the error "maximum number of expressions in a list is 1000"
我在 HQL 查询中传递了一个包含 1000 多个元素的列表,并且
收到此错误
maximum number of expressions in a list is 1000
我在 Whosebug 上阅读了几篇建议将列表划分为几个子列表的帖子。
Query query = session.createQuery(
"SELECT r.subject, COUNT(DISTINCT ss.id), COUNT(DISTINCT r.uid)\n" +
"FROM " + R.class.getName() + " r\n" +
"," + SS.class.getName() + " ss\n" +
"WHERE r.id = ss.id\n" +
"AND r.uid in (:listMoreThan1000)\n" +
"GROUP BY r.subject\n"
);
query.setParameterList("listMoreThan1000", listMoreThan1000);
List<Object[]> rows = query.list();
// code to parse the rows
我是 HQL 查询的新手,有人可以告诉我如何在我的代码中将 listMoreThan1000
划分为几个子列表吗?
尝试使用元组,或者如果可能的话使用子查询。
- 1000 项,例如 IN (1, 2, 3, ..., 1000)
- 不限制套数:IN ((1), (2), (3), ...) * <=== NOT REMOVE! * 见下文
- 子查询无限制:IN (SELECT ...)
错误很明显,只需将大列表拆分为小列表而不是将它们传递给查询,如果您使用的是 Java 8+,则可以使用此方法 Divide a list to lists of n size in Java 8 by Szymon Stepniak,
private static <T> Collection<List<T>> partition(List<T> list, int size) {
final AtomicInteger counter = new AtomicInteger(0);
return list.stream()
.collect(Collectors.groupingBy(it -> counter.getAndIncrement() / size))
.values();
}
那么您的服务可以如下所示:
List<String> listMoreThan1000 = ...;
int size = 1000;
Collection<List<String>> split = partition(listMoreThan1000, size);
String inClause = "", or = "";
for (int i = 0; i < split.size(); i++) {
inClause += or + "r.uid in ?" + i;
or = " OR ";
}
String query = String.format("SELECT r.subject, COUNT(DISTINCT ss.id), COUNT(DISTINCT r.uid)" +
" FROM %s r, %s ss" +
" WHERE r.id = ss.id" +
" AND %s GROUP BY r.subject", R.class.getName(), SS.class.getName(), inClause);
Query query = session.createQuery(query);
for (int i = 0; i < split.size(); i++) {
query.setParameter("?" + i, split.get(i));
}
List<Object[]> rows = query.list();
您的查询最终应该如下所示:
SELECT r.subject, COUNT(DISTINCT ss.id), COUNT(DISTINCT r.uid)
FROM R r, SS ss
WHERE r.id = ss.id
AND r.uid in ?1 OR r.uid in ?2 OR r.uid in ?3 GROUP BY r.subject
注意这部分:
r.uid in ?1 OR r.uid in ?2 OR r.uid in ?3
这将检查您的 uid 是否存在于第一个子列表或第 2 个子列表中...直到第 n 个子列表
我在 HQL 查询中传递了一个包含 1000 多个元素的列表,并且 收到此错误
maximum number of expressions in a list is 1000
我在 Whosebug 上阅读了几篇建议将列表划分为几个子列表的帖子。
Query query = session.createQuery(
"SELECT r.subject, COUNT(DISTINCT ss.id), COUNT(DISTINCT r.uid)\n" +
"FROM " + R.class.getName() + " r\n" +
"," + SS.class.getName() + " ss\n" +
"WHERE r.id = ss.id\n" +
"AND r.uid in (:listMoreThan1000)\n" +
"GROUP BY r.subject\n"
);
query.setParameterList("listMoreThan1000", listMoreThan1000);
List<Object[]> rows = query.list();
// code to parse the rows
我是 HQL 查询的新手,有人可以告诉我如何在我的代码中将 listMoreThan1000
划分为几个子列表吗?
尝试使用元组,或者如果可能的话使用子查询。
- 1000 项,例如 IN (1, 2, 3, ..., 1000)
- 不限制套数:IN ((1), (2), (3), ...) * <=== NOT REMOVE! * 见下文
- 子查询无限制:IN (SELECT ...)
错误很明显,只需将大列表拆分为小列表而不是将它们传递给查询,如果您使用的是 Java 8+,则可以使用此方法 Divide a list to lists of n size in Java 8 by Szymon Stepniak,
private static <T> Collection<List<T>> partition(List<T> list, int size) {
final AtomicInteger counter = new AtomicInteger(0);
return list.stream()
.collect(Collectors.groupingBy(it -> counter.getAndIncrement() / size))
.values();
}
那么您的服务可以如下所示:
List<String> listMoreThan1000 = ...;
int size = 1000;
Collection<List<String>> split = partition(listMoreThan1000, size);
String inClause = "", or = "";
for (int i = 0; i < split.size(); i++) {
inClause += or + "r.uid in ?" + i;
or = " OR ";
}
String query = String.format("SELECT r.subject, COUNT(DISTINCT ss.id), COUNT(DISTINCT r.uid)" +
" FROM %s r, %s ss" +
" WHERE r.id = ss.id" +
" AND %s GROUP BY r.subject", R.class.getName(), SS.class.getName(), inClause);
Query query = session.createQuery(query);
for (int i = 0; i < split.size(); i++) {
query.setParameter("?" + i, split.get(i));
}
List<Object[]> rows = query.list();
您的查询最终应该如下所示:
SELECT r.subject, COUNT(DISTINCT ss.id), COUNT(DISTINCT r.uid)
FROM R r, SS ss
WHERE r.id = ss.id
AND r.uid in ?1 OR r.uid in ?2 OR r.uid in ?3 GROUP BY r.subject
注意这部分:
r.uid in ?1 OR r.uid in ?2 OR r.uid in ?3
这将检查您的 uid 是否存在于第一个子列表或第 2 个子列表中...直到第 n 个子列表