我正在尝试使用QueryDSL(包括开始,独占结束日期)为时间间隔创建查询。
在QueryDSL的documentation中,我发现public BooleanExpression between(Expression<T> from, Expression<T> to);
在双方都是独占的,
获得第一个&lt;这个&lt;第二个表达
然而,它转换为Oracle SQL 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))
还是有一个干净的解决方案可以满足我的需求吗?
答案 0 :(得分:3)
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));
}
答案 1 :(得分:0)
这看起来似乎只是伪劣的文档,但是,我不认为它会产生那么大的差异。如果文档做了什么建议那么这对你来说是不合适的;目前发生的情况稍好一些。
Oracle的SQL方言中没有单个表达式代表操作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))
P.S。我对column.like(String)
在SQL中成为column like string
感到有些惊讶;这相当于column = string
。我希望.like()
成为column like string || '%'
,它会在列的开头搜索您要求的字符串。