2016-11-22 4 views
2

Wie kann ich WHERE Klausel schreiben, die so etwas wie WHERE ? BETWEEN col1 AND col2 mit QueryDSL ist? Ich weiß, dass ich schreiben kann wie folgt stattdessen,QueryDSL wie "WHERE? BETWEEN col1 UND col2" schreiben

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

Aber BETWEEN Verwendung macht die Abfrage besser lesbar.

Ich benutze QueryDSL 3.2.3.


UPDATE:

ich mit so etwas wie diese (A testcase which runnable via mvn test) endete:

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); 

Es funktioniert trotzdem aber der Teil = ? ist überflüssig. Ich möchte etwas einfacheres wie:

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

Ich habe keine Ahnung, wie man es schreibt. Gibt es eine Möglichkeit, diese Abfrage über QueryDSL zu erstellen?

+1

Sie könnten [erstellen einen konstanten Ausdruck] (/ Fragen/7661770/how-to-create-Konstante-numeric-Wert-Ausdruck-in-querydsl) und verwendet seine 'between' Methode. Funktioniert es? –

+0

@Rhymoid Hallo, danke die Info. Ich habe gerade nachgeforscht und die Frage bearbeitet und eine weitere Frage hinzugefügt. Hast du eine Ahnung davon? –

+0

@Rhymoid Ich fand die Antwort. Danke für Ihre Hilfe! http://StackOverflow.com/a/40759823/3591946 –

Antwort

4

Ich habe das gerade gefunden:

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); 

Diese Konstrukte, die ich genau suchte.

Testfall: https://github.com/lbtc-xxx/querydsl-sandbox/blob/master/src/test/java/sandbox/QueryDslBetweenTest.java

+0

Funktioniert 'Expressions.constant (Konstante) .between (m.col1, m.col2) 'nicht? –

+1

Es erzeugt einen Kompilierungsfehler aufgrund von 'Ausdruck' hat nicht die Methode' between() ', [zumindest mit QueryDSL 3.2.3] (http://www.querydsl.com/static/querydsl/3.2.3 /apidocs/com/mysema/query/types/Expression.html). –

Verwandte Themen