jpa querydsl
Spring Data及其CDI对应的DeltaSpike Data是很棒的工具。 它们极大地提高了您的生产率,尤其是在启动项目时,并且当您需要使用较低级别的API创建更复杂的东西时,它们不会妨碍您。
但是它们最酷的功能,基于方法命名的自动生成查询以及JPQL / SQL查询都有一些缺点。 您的方法名称很容易变得很长,并且不能在方法名称上添加换行符。 而且,就像您要使用查询语言一样,即使使用了良好的工具,也可能存在在开发过程中无法轻易发现的问题。
QueryDSL是一个库,可使用类型明确的Java API轻松构建查询。 它的强大之处在于基于您的实体类自动生成的帮助器类。 通过IDE的自动完成功能和强大的键入功能,使构建与首次运行一起使用的查询非常容易,这与我编写的大多数SQL或JPQL查询不同。 QueryDSL实际上支持多个后端,但是它的JPA支持自然是我们要在这里使用的东西。
Spring Data和DeltaSpike Data模块都支持使用QueryDSL编写自定义查询。 因此,您应该将其视为补充工具,以替代其中任何一个,当“存储库生成器”不再那么方便时,您可以使用它。 而且,您可以将其视为对开发人员更友好的方式,以编程方式表达您的查询,而不是使用有些棘手的JPA Criteria API构建查询。
就个人而言,当基于简单方法名称的感觉不再足够时,我会选择JPQL而不是Criteria API,但是QueryDSL无疑将竞争重新转向了编程查询定义。
要开始使用QueryDSL,您需要设置注释处理器来创建帮助器类。 一种简单的方法是在您的项目中添加以下maven插件:
<plugin>
<groupId>com.mysema.maven</groupId>
<artifactId>apt-maven-plugin</artifactId>
<version>1.1.3</version>
<executions>
<execution>
<id>querydsl</id>
<goals>
<goal>process</goal>
</goals>
<configuration>
<outputDirectory>target/generated-sources/querydsl</outputDirectory>
<processor>com.mysema.query.apt.jpa.JPAAnnotationProcessor</processor>
</configuration>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>com.mysema.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
<version>3.6.1</version>
</dependency>
</dependencies>
</plugin>
在运行时,您需要以下依赖项:
<dependency>
<groupId>com.mysema.querydsl</groupId>
<artifactId>querydsl-core</artifactId>
<version>3.6.1</version>
</dependency>
<dependency>
<groupId>com.mysema.querydsl</groupId>
<artifactId>querydsl-jpa</artifactId>
<version>3.6.1</version>
</dependency>
使用QueryDSL作为两个存储库生成器的补充很容易,但是Spring Data有了更深的集成。 借助其findAll(Predicate谓词,Pageable页面可分页)方法,您可以直接为查询定义谓词,并使用标准的Spring Data排序和分页API以及基于QueryDSL的查询。
还请参见: JPA生产力提升器#1:Spring数据
本文的用例可以结合使用Spring Data和QueryDSL来编写,如下所示:
public List<Contact> findPaged(Invoicer invoicer, String filter,
int firstResult, int maxResults) {
return repository.findAll(
QContact.contact.name.startsWithIgnoreCase(filter)
.and(QContact.contact.invoicer.eq(invoicer)),
new PageRequest(firstResult / maxResults, maxResults)
).getContent();
}
我很高兴能够探索Java EE应用程序的各种JPA帮助程序库。 在启动以数据为中心的应用程序方面,我已经知道Spring Data是一个超酷的野兽,但是我还没有意识到在其他标准Java EE环境中使用它是如此容易。
我还发现,对于相同的用例,DeltaSpike Data是一个切实可行的替代方案。 它还具有一个很酷的“示例查询”功能,您无法在Spring Data中找到该功能。 如果我必须在他们之间进行选择,我可能会掷硬币或根据团队的现有经验做出决定。
我也终于真正尝试使用QueryDSL。 我已经阅读了几篇有关它的文章,并且已经对它的用途深信不疑,但从未真正尝试过它。 如果将构建脚本与从中获得的生产力提升进行比较,那么设置构建脚本来自动生成查询助手类是一个小麻烦。 有了它,您可以对SQL或JPQL查询中的讨厌的错字说“再见”。 如果您的应用程序中有很多复杂的查询,则一定要签出该库。 它也可以很好地补充“存储库”。
还请参见: JPA生产力提升器2:DeltaSpike数据
希望您能从我的经验中学到东西。 要快速使用这些工具中的任何一个,请在GitHub上查看我简单的全栈电话簿CRUD示例,该示例在数据库上具有三个不同的外观,并使用最佳的JPA生产力增强器实现。
翻译自: https://jaxenter.com/top-3-jpa-productivity-boosters-for-java-ee-developers-querydsl-116135.html
jpa querydsl