使用 QueryDSL 和 Spring 的存储库编写跨表查询

Posted

技术标签:

【中文标题】使用 QueryDSL 和 Spring 的存储库编写跨表查询【英文标题】:Write cross-table queries with QueryDSL and Spring's Repository 【发布时间】:2014-06-02 02:38:35 【问题描述】:

我已经构建了一个 DAL,它使用 Spring 的存储库通过 Hibernate 和 JPA 管理 mysql DB 上的 CRUD 操作。特别是这是我的存储库定义

package my.dal.repository;

import my.domain.dal.User;

import org.springframework.data.querydsl.QueryDslPredicateExecutor;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;


@Repository
public interface IUserRepository extends CrudRepository<User, String>, QueryDslPredicateExecutor<User>


有了这个定义,我可以使用 QueryDSL 谓词执行 CRUD 操作 通过QueryDslPredicateExecutor接口和findAll(Predicate)方法的扩展。

我面临的问题是这种方式我无法进行跨表查询。事实上,我不能使用 QueryDSL 的连接工具,因为我没有 HibernateQuery

使用 Spring Repositories 和 QueryDSL 实现 join 操作的正确方法是什么?

谢谢

【问题讨论】:

【参考方案1】:

解决了。

下面我写了使用 Spring Repositories 执行 QueryDSL 查询所需的步骤

    通过在带有@PersistenceContext注解的Service类中添加EntityManager属性来获取应用程序上下文中使用的EntityManager

    @PersistenceContext
    EntityManager em;
    

    这样 em 属性将链接到 EntityManager bean 在 Spring 应用程序上下文中定义。

    实例化一个JPAQuery 对象并使用它

    QUser qUser = QUser.user;
    JPQLQuery query = new JPAQuery(em);
    User charlie = query
        .from(qUser)
        .where(qUser.username.eq("charlie"))
        .uniqueResult(qUser);
    

现在我们可以使用JPQLQuery 对象在不同的​​表上执行连接。

希望对你有帮助

【讨论】:

以上是关于使用 QueryDSL 和 Spring 的存储库编写跨表查询的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 querydsl 测试更新?

通用代码因 Spring 数据和 Querydsl 而失败

在 Spring Data 中为同一 QueryDSL 路径创建多个别名

Spring Boot,Hibernate,Querydsl:antlr.NoViableAltException:意外令牌

将 Querydsl 与 Spring Data 一起使用时的最佳实践

Spring QueryDsl 分页过滤器按 ACL 权限