Apakah ada solusi bersih untuk mencapai awal yang inklusif, akhir yang eksklusif di QueryDSL/Oracle SQL?

Saya mencoba membuat kueri untuk interval waktu menggunakan QueryDSL (tanggal mulai inklusif, tanggal akhir eksklusif).

Di rel dokumentasi QueryDSL Saya menemukan bahwa public BooleanExpression between(Expression<T> from, Expression<T> to); eksklusif di kedua sisi,

Dapatkan ekspresi pertama ‹ ini ‹ kedua

namun ini diterjemahkan menjadi Oracle SQL BETWEEN yang inklusif di kedua sisi
(setara dengan first <= this <= second).

QueryDSL seperti ini:

[...]
person.name.like(n)
  .and(person.birthdate.between(from, to))
[...]

diterjemahkan ke Oracle SQL seperti ini:

SELECT *
FROM PERSON
WHERE NAME LIKE n
  AND BIRTHDATE BETWEEN from AND to;

Adakah yang tahu alasan/logika di balik ini?
Apakah ini hanya dokumentasi 'busuk'?

Jelas di antara keduanya tidak akan berhasil untuk saya.

Haruskah saya lebih suka menggunakan yang lebih kikuk

person.name.like(n)
  .and(person.birthdate.goe(from)
  .and(person.birthdate.lt(to))

atau adakah solusi bersih yang sesuai dengan keinginan saya?


person MrMeszaros    schedule 03.08.2015    source sumber
comment
Jika ini SQL biasa, saya akan menggunakan between "from" and "to" - 1? (dengan asumsi to_ adalah nilai DATE   -  person a_horse_with_no_name    schedule 03.08.2015
comment
Itu hanya berfungsi jika semua tanggal terpotong @a_horse; permintaan sebenarnya OP adalah between "from" and "to" - interval '1' second   -  person Ben    schedule 03.08.2015


Jawaban (2)


Dokumentasi telah diperbaiki beberapa waktu lalu http://www.querydsl.com/static/querydsl/2.2.0/apidocs/com/mysema/query/types/expr/ComparableExpression.html#between(T,%20T)

2.2.0 dirilis pada 18.7.2011. Saya sangat menyarankan Anda menggunakan versi Querydsl yang lebih baru dari 4.* atau 3.*.

Untuk permulaan inklusif, akhir eksklusif Anda dapat menulis metode utilitas Anda sendiri:

public static <T> Predicate range(ComparableExpression<T> expr, T from, T to) {
    return expr.goe(expr).and(expr.lt(to));
}
person Timo Westkämper    schedule 03.08.2015

Tampaknya ini hanya dokumentasi yang buruk, namun menurut saya tidak banyak perbedaannya. Jika dokumentasi sesuai dengan yang disarankan maka itu tidak pantas untuk Anda; apa yang terjadi saat ini sedikit lebih baik.

Tidak ada satu ekspresi pun dalam dialek SQL Oracle yang akan mewakili operasi first <= this < second. Jadi, Anda masih harus melakukan sesuatu seperti ini:

person.name.like(n)
  .and(person.birthdate.between(from, to)
  .and(person.birthdate.lt(to))

yang akan direpresentasikan dalam SQL sebagai:

select *
  from person
 where name like n
   and birthdate between from and to
   and birthdate < to

Pada titik ini, Anda dapat dengan mudah menyatakan niat Anda dengan jelas di awal dan melakukan apa yang Anda inginkan:

person.name.like(n)
  .and(person.birthdate.goe(from)
  .and(person.birthdate.lt(to))

P.S. Saya sedikit terkejut bahwa column.like(String) menjadi column like string di SQL; ini setara dengan column = string. Saya berharap .like() menjadi column like string || '%', yang akan mencari string yang Anda minta di awal kolom.

person Ben    schedule 03.08.2015