2016-11-22 5 views
2

WHERE節はQueryDSLでWHERE ? BETWEEN col1 AND col2のように書くことができますか?私はQueryDSL「WHERE?COL1とCOL2の間」

... 
.where(mytable.col1.loe(constant), mytable.col2.goe(constant)) 
... 

、代わりに次のように私は書くことができます知っている。しかしBETWEENを使用すると、クエリがより読みやすくなります。

私はQueryDSL 3.2.3を使用します。


UPDATE:それはとにかく動作しますが、一部= ?が冗長である

final int constant = 10; 
final QMyTable m = QMyTable.myTable; 
final SimpleExpression<Boolean> operation = Expressions.operation(Boolean.class, Ops.BETWEEN, 
     Expressions.constant(constant), m.col1, m.col2); 

// This yields: 
// SELECT ID, COL1, COL2 FROM MYTABLE WHERE ((? BETWEEN COL1 AND COL2) = ?) 
// bind => [10, true] 
final MyTable actual = new JPAQuery(em).from(m).where(operation.eq(true)).uniqueResult(m); 

私はこのような何か(A testcase which runnable via mvn test)になってしまいました。私はもっ​​とシンプルなものがほしいと思っています:

SELECT ID, COL1, COL2 FROM MYTABLE WHERE (? BETWEEN COL1 AND COL2) 

私はそれを書く方法がありません。 QueryDSL経由でこのクエリを構築する方法はありますか?

+1

あなたは(/質問/ 7661770 /ハウツー作成-定数値値式で-querydsl)[定数式を作成]とその 'between'メソッドを使用することができます。それは動作しますか? –

+0

@Rhymoidこんにちは、ありがとうございました。私はちょうどそれについて調査し、質問を編集し、別の質問を追加しました。あなたはそれについて何か考えていますか? –

+0

@Rhymoid答えを見つけました。ご協力ありがとうございました! http://stackoverflow.com/a/40759823/3591946 –

答えて

4

私はこれを見つけた:これは私がまさに探していたものを構築し

final int constant = 10; 
final QMyTable m = QMyTable.myTable; 
final BooleanExpression operation = Expressions.booleanOperation(Ops.BETWEEN, 
     Expressions.constant(constant), m.col1, m.col2); 

// This yields: 
// SELECT ID, COL1, COL2 FROM MYTABLE WHERE (? BETWEEN COL1 AND COL2) 
// bind => [10] 
final MyTable actual = new JPAQuery(em).from(m).where(operation).uniqueResult(m); 

テストケース:https://github.com/lbtc-xxx/querydsl-sandbox/blob/master/src/test/java/sandbox/QueryDslBetweenTest.java

+0

'' Expressions.constant(constant).between(m.col1、m.col2) 'は動作しませんか? –

+1

'Expression'が' between() '、[少なくともQueryDSL 3.2.3で]メソッドを持たないため、コンパイルエラーが発生します(http://www.querydsl.com/static/querydsl/3.2.3 /apidocs/com/mysema/query/types/Expression.html)。 –

関連する問題