我正在尝试使用QueryDSL (包含开始,独占结束日期)创建一个时间间隔的查询。
在“纽约时报”( 文档 of QueryDSL )中,我发现public BooleanExpression between(Expression<T> from, Expression<T> to);
在双方都是独家的,
获得第一个<这个<第二个表达式
然而,它转化为Oracle BETWEEN
,这在双方都是包容的。
(相当于first <= this <= second
)。
像这样的QueryDSL:
[...]
person.name.like(n)
.and(person.birthdate.between(from, to))
[...]
像这样转换为Oracle SQL:
SELECT *
FROM PERSON
WHERE NAME LIKE n
AND BIRTHDATE BETWEEN from AND to;
有人知道这背后的原因/逻辑吗?
只是那些“烂”的文件吗?
很明显,两者之间对我来说是行不通的。
我是不是应该用更笨重的
person.name.like(n)
.and(person.birthdate.goe(from)
.and(person.birthdate.lt(to))
还是有一个干净的解决方案能做我想要的?
发布于 2015-08-03 08:06:06
这些文档早在http://www.querydsl.com/static/querydsl/2.2.0/apidocs/com/mysema/query/types/expr/ComparableExpression.html#between(T,%20T)之前就已经修复了。
2.2.0于2011年7月18日发布。我强烈建议您使用4.*或3.*中新版本的Querydsl。
对于包容性启动,可以编写自己的实用程序方法:
public static <T> Predicate range(ComparableExpression<T> expr, T from, T to) {
return expr.goe(expr).and(expr.lt(to));
}
发布于 2015-08-03 03:53:26
这看起来确实只是拙劣的文档,然而,我不认为它有那么大的区别。如果文档按照建议做了,那么这对您来说是不合适的;当前发生的事情会稍微好一些。
Oracle方言中没有一个表达式表示操作first <= this < second
。因此,您仍然需要这样做:
person.name.like(n)
.and(person.birthdate.between(from, to)
.and(person.birthdate.lt(to))
它将在SQL中表示为:
select *
from person
where name like n
and birthdate between from and to
and birthdate < to
在这一点上,很容易在前面清楚地陈述你的意图,并做你想做的事情:
person.name.like(n)
.and(person.birthdate.goe(from)
.and(person.birthdate.lt(to))
在SQL中,column.like(String)
变成了column like string
,我有点惊讶;这相当于column = string
。我原以为.like()
会变成column like string || '%'
,它会在列的开头搜索所要求的字符串。
https://stackoverflow.com/questions/31786085
复制相似问题