【问题标题】:How to write subquery in querydsl?如何在querydsl中编写子查询?
【发布时间】:2015-05-17 17:58:19
【问题描述】:

我在我的项目中使用了 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();

【问题讨论】:

  • 我不认为这个问题有资格获得否决而不是得到答案。我想使用 querydsl 转换此代码,因为我在项目中主要使用 querydsl。我搜索了 querydsl 子查询示例,但没有找到合适的示例。所以我把我的问题放在这里。谢谢

标签: hibernate spring-data-jpa querydsl


【解决方案1】:

你需要使用JPASubQuery

来自manual

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

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

对于基于 Hibernate 的子查询用法,请使用 HibernateSubQuery 而是。

【讨论】:

    【解决方案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());
    

    【讨论】:

    • 我正在尝试按照你的例子来实现
    • ListSubQuery listSubQuery = new JPASubQuery() .from(QOpenChart.openChart) .orderBy(QOpenChart.openChart.id.desc()) .list(QOpenChart.openChart.); QOpenChart qOpenChart = new QOpenChart("子查询"); List openCharts = pageableQuery(pageable) .from((EntityPath>) listSubQuery.as("subquery")) .where(qOpenChart.userId.id.eq(userId)) .groupBy(qOpenChart.patientChart.id ) .orderBy(qOpenChart.id.asc()).list(qOpenChart);
    • 在第 1 行,我没有找到任何 all 方法,最后一行它要求 listsubquery 是元组列表的实体。我试图转换为 like(EntityPath>) listSubQuery.as("子查询")
    • 但它抛出异常
    • @Santosh Narna,我的示例是用于本机查询的 QueryDSL-SQL。如果你需要一个对象,你应该使用 QueryDSL-JPA。例如,您的回报应该是 ListSubQuery,而不是 ListSubQuery。我不需要任何带有 querydsl-jpa 的项目来运行一些测试,对不起。
    猜你喜欢
    • 2019-07-17
    • 1970-01-01
    • 2019-09-02
    • 2010-12-10
    • 2017-05-25
    • 1970-01-01
    • 1970-01-01
    • 2020-10-04
    • 2022-01-03
    相关资源
    最近更新 更多