【问题标题】:How can I convert below sql to Querydsl code?(querydsl oracle hierarchical query, level, lpad)如何将下面的 sql 转换为 Querydsl 代码?(querydsl oracle 分层查询,级别,lpad)
【发布时间】:2016-06-19 03:24:34
【问题描述】:

如何将下面的 sql 转换为Querydsl 代码?

(querydsl oracle分层查询,级别,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

【问题讨论】:

  • START WITH ... CONNECT BY 是 Oracle 用于分层查询的古老语法,最终标准化的 SQL 提出了一种机制来做同样的事情,即递归 WITH 子句。 QueryDSL 支持recursive WITH clauses

标签: oracle hierarchical-data querydsl


【解决方案1】:

支持,见com.querydsl.sql.oracle.OracleQuery(http://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);

【讨论】:

    猜你喜欢
    • 2016-08-08
    • 1970-01-01
    • 2020-02-05
    • 2015-10-21
    • 2014-10-19
    • 2017-05-09
    • 2019-05-31
    • 2022-08-18
    • 1970-01-01
    相关资源
    最近更新 更多