是否有一个干净的解决方案来实现QueryDSL / Oracle SQL中的包容性启动,独占结束?

时间:2015-08-03 11:29:47

标签: sql oracle querydsl

我正在尝试使用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))

还是有一个干净的解决方案可以满足我的需求吗?

2 个答案:

答案 0 :(得分:3)

文档已在前一段时间修复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));
}

答案 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 || '%',它会在列的开头搜索您要求的字符串。