如何使用 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?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 BooleanBuilder (QueryDSL) 为可选的 OnetoOne JPA/Hibernate 关系建模谓词?