如何使用 QueryDSL 构建 GenericDao?

Posted

技术标签:

【中文标题】如何使用 QueryDSL 构建 GenericDao?【英文标题】:How do I build a GenericDao using QueryDSL? 【发布时间】:2014-02-15 06:27:44 【问题描述】:

首先,我对 QueryDSL 很陌生。

我使用的是 Spring + Hibernate 环境。

我面临的问题是构建一个 GenericDAO 来实现所有基本的 CRUD 操作,但我不确定如何从 QEntity 获取静态引用。

我的实体类结构如下:

    @Entity //jpa
    public class Entity extends AbstractEntity
    //fields
    ...
    

    public abstract class AbstractEntity
    //Logger 
    

QueryDSL 生成实体的基本结构

    public class QEntity extends PEntity<Entity>
    ...
    public static final QEntity entity = new QEntity("entity");        
    ...
    //constructors

     

GenericDao 看起来像这样:

    public class abstract GenericDao<T extends AbstractEntity, K extends PEntity<? extends AbstractEntity>>

    //some kind of method to get the K.k (QEntity.entity) reference.        
    //CRUD operations using T and K

    

一种方法是使用反射,但我不提倡使用这种方法,尤其是在这种情况下。

我不确定的另一件事是,是否必须使用来自 QEntity 的静态引用来构建查询,或者如果我调用构造函数来获取新对象是否可以。还有,构造函数参数中的String是什么意思?

    public QEntity(String variable) 
    this(Entity.class, forVariable(variable), INITS);
    

【问题讨论】:

【参考方案1】:

我面临的问题是构建一个 GenericDAO 来实现所有 基本的 CRUD 操作,但我不确定如何获得静态 来自 QEntity 的引用。

没有对 QEntity 类的引用会很困难,因此请确保向您的 DAO 提供它的实例。

我不确定的另一件事是,是否必须使用静态 从 QEntity 引用来构建查询,或者如果我做一个可以 构造函数调用以获取新对象。另外,字符串中的什么 构造函数参数是否表示?

不,这不是强制性的,这是一个方便的实例。构造函数参数是变量名。如果您提供自定义实例,请确保始终使用相同的变量名称。

还要确保您使用最新的 Querydsl 版本。 PEntity 看起来像 2.0 之前的类。

这是一个通用 DAO 超类的示例,用于 Querydsl JPA https://github.com/querydsl/querydsl/blob/master/querydsl-examples/querydsl-example-jpa-guice/src/main/java/com/querydsl/example/jpa/repository/AbstractRepository.java

更新

如果您想避免将 Q 类型传递给您的 DAO 类,您可以使用像这样的模式https://github.com/spring-projects/spring-data-jpa/blob/master/src/main/java/org/springframework/data/jpa/repository/support/QueryDslRepositorySupport.java#L54

变量名将是您的实体类的简单名称,第一个字母转换为小写。

【讨论】:

正确链接github.com/spring-projects/spring-data-jpa/blob/master/src/main/…

以上是关于如何使用 QueryDSL 构建 GenericDao?的主要内容,如果未能解决你的问题,请参考以下文章

如何从querydsl获得完全物化的查询

如何使用 BooleanBuilder (QueryDSL) 为可选的 OnetoOne JPA/Hibernate 关系建模谓词?

Maven 使用 spring-data-jpa 和 querydsl 构建问题

如何在没有域类的 querydsl 中构造查询

QueryDSL 在构建谓词查询时添加交叉连接

附加 QueryDSL 谓词或基于过滤器值构建谓词