领先一步
VMware 提供培训和认证,助您加速进步。
了解更多Spring Data JPA 的一个便捷功能是允许您通过其 @Query 注解插入自定义 JPA 查询。
这允许一定的灵活性,因为您仍然可以向应用程序的消费者提供排序参数。请查看下面的示例
interface SampleRepository extends CrudRepository<Employee, Long> {
@Query("select e from Employee e where e.firstName = :firstName")
List<Employee> findCustomEmployees(String firstName, Sort sort);
}
当 Spring Data JPA 收到一个带有条件(firstName)和自定义排序(通过 findCustomEmployees("Alice", Sort.by("lastName")))的自定义查询时,它会将其转换为一个完整的 JPA 查询,如下所示:
select e
from Employee e
where e.firstName = :firstName
order by e.lastName
除此之外,Spring Data JPA 还支持分页,这需要能够统计结果集。
过去,随着查询变得越来越复杂,我们“做正确的事情”并应用能够正确指向主 SELECT 子句别名值的“order by”子句的能力,至少可以说一直充满挑战。
用一个适当的 count() 函数来封装投影也很棘手。想象一下,当存在子查询、case 语句和其他深度查询时这样做!
我们很高兴地宣布 HQL 和 JPQL 解析器都已发布,这将使您在 Spring Data JPA 应用程序中自定义查询变得更加容易。
我们结合 JPA 和 Hibernate 规范,开发了基于 ANTLR 的查询解析引擎,并利用它们更准确地应用所需的定制,以更好地为您服务。
我们不仅可以找到放置 count() 函数的“正确位置”,还可以获取主 FROM 表达式的别名,甚至可以检测语义情况。
有了查询解析器,更容易发现有效和无效查询。有时,我们花费更多的时间来确定一个查询是否正确,然后才弄清楚如何正确处理它。
好消息是……它会自动应用。
当使用 @Query 注解时,有一个关键参数:isNative。这个布尔标志让您可以表明您正在编写的是原生 SQL(isNative=true)还是 JPA 查询(默认为 isNative=false)。
如果您有一个 JPA 查询(isNative=false)并且 Hibernate 在类路径中,它将使用我们新的 HQL 解析器。如果 Hibernate 不在类路径中,它将回退到功能有限的 JPQL 解析器。(受限于规范,而非我们的实现。)
因此,您只需获取 Spring Data 发布列车的最新快照版本(Spring Data 3.1 快照)或获取 Spring Boot 的下一个里程碑版本即可。
还有更多功能待添加。例如,可能存在更复杂的别名,例如:
select AVG(e.timeToCloseTickets) as avg
from Employee e
当您应用 Sort.by("avg") 时,这种类型的查询不应该产生 order by e.avg,而应该仅仅是 order by avg。我们正在研究添加对其他场景的支持。但是有了这些查询解析器,支持这些情况变得容易得多。
我们还有一个与查询解析相关的积压工单,现在可以着手处理了。
作为一个额外福利,如果您想预先检查我们自己的自定义查询,今天的工具可以一窥究竟。
如果您使用 IntelliJ IDEA,有一个 ANTLR 插件 (https://plugins.jetbrains.com/plugin/7358-antlr-v4) 安装后,可以运行任何 ANTLR 语法文件并进行测试。
src/main/antlr4/org/springframework/data/jpa/repository/query/Hql.g4。
(我们最近请人们提交他们最疯狂的 JPA 查询,这是其中之一。乍一看,该查询是有效的,您甚至可以放大查看更多内容。)
祝好,--Greg Turnquist