如何在querydsl中编写子查询?

San*_*rna 6 java hibernate querydsl spring-data-jpa

我在我的项目中使用了 querydsl、hibernate 和 spring data jpa。我编写了这个本机查询并且工作正常。但是我如何在 Querydsl 中编写这个查询。

List<OpenChart> openChartList = (List<OpenChart>) getEntityManager()
.createNativeQuery( "select * from (select * from open_chart order by id desc ) open_chart where user_id="+userId+" group by patient_chart_id order by id",OpenChart.class).getResultList();
Run Code Online (Sandbox Code Playgroud)

den*_*nov 6

您需要使用JPASubQuery

手册

2.1.13. 子查询 要创建子查询,您需要创建一个 JPASubQuery 实例,通过 from、where 等定义查询参数,并使用 unique 或 list 创建子查询,这只是查询的类型安全 Querydsl 表达式。unique 用于唯一(单个)结果,list 用于列表结果。

 QEmployee employee = QEmployee.employee; 
 QEmployee e = new QEmployee("e"); 
 query.from(employee)
      .where(employee.weeklyhours.gt(
           new JPASubQuery().from(employee.department.employees, e)
                            .where(e.manager.eq(employee.manager))
                            .unique(e.weeklyhours.avg())
       )).list(employee); 
Run Code Online (Sandbox Code Playgroud)

对于基于 Hibernate 的子查询用法,请改用 HibernateSubQuery。


Mar*_*ick 2

我准备了一个如何在与您所描述的类似场景中使用子查询的示例,希望对您有所帮助并为其实现提供基础:

    SQLQuery sqlQuery = new SQLQuery(connection, PostgresTemplates.builder().quote().newLineToSingleSpace()
            .printSchema().build());

    ListSubQuery<Tuple> listSubQuery = new SQLSubQuery().from(QUsersPasswords.usersPasswords).orderBy(QUsersPasswords.usersPasswords.usuNummat.desc()).list(QUsersPasswords.usersPasswords.all());

    QUsersPasswords qSubquery = new QUsersPasswords("subquery");

    sqlQuery.from(listSubQuery.as("subquery")).limit(10);

    sqlQuery.list(qSubquery.all());
Run Code Online (Sandbox Code Playgroud)