JPA - 在 where 子句中使用 'composite values' 进行查询
JPA - Query with 'composite values' in where-clause
我想在 JPA 2.1 中使用 Eclipselink 作为实现来实现以下(对于此示例:MySQL)语句:
select *
from account
where (mailing_zip_code, id) > (56237, 275)
order by mailing_zip_code asc, id asc
limit 10;
我想要实现的是在查询中不使用偏移量的情况下实现无限滚动的 seek 方法。由于关注 where 子句,我无法为该构造找到正确的名称。在某些地方它被称为'composite value',但我找不到这个名字的结果,但它似乎符合SQL-92 标准。
这个语句将通过过滤器参数进行扩展,所以我自然想用 JPA 标准构建它 API。
我在 API 上搜索了一段时间,现在有人知道这是否可行吗?
意识到
之后
select *
from account
where (mailing_zip_code, id) > (56237, 275)
order by mailing_zip_code asc, id asc
limit 10;
只是一种较短的写法
select *
from account
where mailing_zip_code > '56237'
or (mailing_zip_code = '56237' AND id > 276)
order by mailing_zip_code asc, id asc
limit 10;
条件查询毕竟不是那么难(仅附加谓词):
if (null != startId) {
Predicate dateGreater = cb.greaterThan(entity.get(sortBy), startValue);
Predicate dateEqual = cb.equal(entity.get(sortBy), startValue);
Predicate idGreater = cb.greaterThan(entity.get("id"), startId);
Predicate dateEqualAndIdGreater = cb.and(dateEqual, idGreater);
cb.or(dateGreater, dateEqualAndIdGreater);
}
如果有更好的方法,我很乐意学习
我想在 JPA 2.1 中使用 Eclipselink 作为实现来实现以下(对于此示例:MySQL)语句:
select *
from account
where (mailing_zip_code, id) > (56237, 275)
order by mailing_zip_code asc, id asc
limit 10;
我想要实现的是在查询中不使用偏移量的情况下实现无限滚动的 seek 方法。由于关注 where 子句,我无法为该构造找到正确的名称。在某些地方它被称为'composite value',但我找不到这个名字的结果,但它似乎符合SQL-92 标准。
这个语句将通过过滤器参数进行扩展,所以我自然想用 JPA 标准构建它 API。
我在 API 上搜索了一段时间,现在有人知道这是否可行吗?
意识到
之后select *
from account
where (mailing_zip_code, id) > (56237, 275)
order by mailing_zip_code asc, id asc
limit 10;
只是一种较短的写法
select *
from account
where mailing_zip_code > '56237'
or (mailing_zip_code = '56237' AND id > 276)
order by mailing_zip_code asc, id asc
limit 10;
条件查询毕竟不是那么难(仅附加谓词):
if (null != startId) {
Predicate dateGreater = cb.greaterThan(entity.get(sortBy), startValue);
Predicate dateEqual = cb.equal(entity.get(sortBy), startValue);
Predicate idGreater = cb.greaterThan(entity.get("id"), startId);
Predicate dateEqualAndIdGreater = cb.and(dateEqual, idGreater);
cb.or(dateGreater, dateEqualAndIdGreater);
}
如果有更好的方法,我很乐意学习