如何将下面的sql转换为Querydsl代码?(querydsl oracle分层查询,level,lpad)

问题描述:

如何将下面的sql转换为Querydsl的代码?如何将下面的sql转换为Querydsl代码?(querydsl oracle分层查询,level,lpad)

(querydsl甲骨文分层查询,水平,LPAD)

select lpad(' ',(level-1)*2,' ') || ename, sal, deptno 
    from emp 
start with ename = 'KING' 
connect by prior empno = mgr 

结果:

KING 5000 10 
    JONES 2975 20 
    SCOTT 3000 20 
     ADAMS 1100 20 
    FORD 3000 20 
     SMITH 800  20 
    BLAKE 2850 30 
    ALLEN 1600 30 
    WARD 1250 30 
    MARTIN 1250 30 
    TURNER 1500 30 
    JAMES 950  30 
    CLARK 2450 10 
+0

START ... CONNECT BY是Oracle历史悠久的分层查询语法,最终标准化的SQL提出了一个机制做同样的递归WITH子句。 QueryDSL支持[递归的WITH子句](https://github.com/querydsl/querydsl/issues/844)。 – APC

+0

请参阅http://www.stackoverflow.com/help/mcve –

据支持,看到com.querydsl.sql.oracle.OracleQueryhttp://www.querydsl.com/static/querydsl/4.0.7/apidocs/com/querydsl/sql/oracle/OracleQuery.html

import com.querydsl.sql.oracle.OracleGrammar; 
import com.querydsl.sql.oracle.OracleQuery; 
import com.querydsl.core.types.dsl.* 
//... 
OracleQuery query = new OracleQuery(getConnection(), config); 
query.select(StringExpressions.lpad(
    Expressions.stringTemplate("' '").stringValue(), 
    OracleGrammar.level.subtract(1).multiply(2), ' ')  
    .concat(emp.ename), 
    emp.sal, emp.deptno) 
.startWith(emp.ename.eq("KING")) 
.connectBy(emp.empno.eq(emp.mgr))  
.from(emp);