2016-11-22 39 views
2

我怎麼能寫WHERE子句,類似WHERE ? BETWEEN col1 AND col2與QueryDSL?我知道我能寫的,而不是如下,QueryDSL如何寫「哪裏?col1和col2之間」

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

但使用BETWEEN使查詢更具可讀性。

我使用QueryDSL 3.2.3。


UPDATE:

我結束了這樣的事情(A testcase which runnable via mvn test):

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

它工作過,但部分= ?是多餘的。我想要更簡單的一件事:

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

我不知道該怎麼寫。有什麼辦法通過QueryDSL來構造這個查詢嗎?

+1

你可以[創建一個常量表達式](/問題/ 7661770 /如何對創建恆定數字值表達,在-querydsl),並使用其'between'方法。那樣有用嗎? – 2016-11-22 07:40:17

+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(常量)。(m.col1,m.col2)'之間的'工作? – 2016-11-23 21:12:22

+1

由於'Expression'在()',[至少在QueryDSL 3.2.3](http://www.querydsl.com/static/querydsl/3.2.3)之間沒有方法',所以會產生編譯錯誤/apidocs/com/mysema/query/types/Expression.html)。 –

相關問題