使用 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 的存储库编写跨表查询的主要内容,如果未能解决你的问题,请参考以下文章
在 Spring Data 中为同一 QueryDSL 路径创建多个别名
Spring Boot,Hibernate,Querydsl:antlr.NoViableAltException:意外令牌