[英]JPA/JPQL automatic method query generation
我有一个同事让我大吃一惊。 我们有一个 Java 11/Spring Boot/Hibernate/JPA 应用程序与 MySQL 数据库通信。 显然,JPA JPQL(或类似的东西)能够 - 但前提是您正确编写存储库方法 - 根据您的方法名称构建查询。
例如,如果我们有一个 JPA 实体:
@Entity
@Table(name = "accounts")
@Data
public class Account {
@Column(name = "account_email")
private String email;
// ... many more fields down here
}
然后是它的存储库:
@Repository
public interface AccountRepository extends JpaRepository<Account,Long> {
@Query("FROM Account WHERE email = :email")
Account findByEmail(@Param(value = "email") String email);
}
显然(这可能是一个不好的例子)我可以将其简化为:
@Repository
public interface AccountRepository extends JpaRepository<Account,Long> {
Account findByEmail(String email);
}
JPA/JPQL 会发现,既然我想“ findByEmail
”并且Account#email
存在,它只需要我做一个SELECT * FROM accounts where email = ?
. 惊人!
唯一的问题是:我没有看到它在任何地方都有很好的记录,我也没有看到它在任何地方正式记录。 我可以找到一些旧博客暗示相同的事情,但没有官方(JPA 文档、JPQL 文档等)详细介绍它的工作原理和局限性。
谁能指出我正确的方向? 这种神秘的特性/技术叫什么,它的局限性/能力是什么? 它只能在 SELECT 上工作还是也可以处理插入/更新/删除?
这是 Spring Data 对 JPA 的支持的一部分。 您可以在文档查询方法和附录部分中的所有支持的查询关键字中找到更多信息。 这是文档的摘录:
关键词 | 描述 |
---|---|
查找...通过,阅读...通过,获取...通过,查询...通过,搜索...通过,流...通过 | 一般查询方法通常返回存储库类型、Collection 或 Streamable 子类型或结果包装器,例如 Page、GeoResults 或任何其他特定于存储的结果包装器。 可用作 findBy...、findMyDomainTypeBy... 或与其他关键字组合使用。 |
存在...由 | 存在投影,通常返回布尔结果。 |
数……按 | 计数投影返回数字结果。 |
删除...通过,删除...通过 | 删除查询方法返回无结果 (void) 或删除计数。 |
……第一……,……顶…… | 将查询结果限制为第一个结果。 此关键字可以出现在 find(和其他关键字)和 by 之间的主题的任何位置。 |
…清楚的… | 使用不同的查询仅返回唯一的结果。 请查阅特定于商店的文档是否支持该功能。 此关键字可以出现在 find(和其他关键字)和 by 之间的主题的任何位置。 |
逻辑关键字 | 关键字表达式 |
---|---|
和 | 和 |
或者 | 或者 |
后 | 之后,是之后 |
前 | 之前,是之前 |
包含 | 包含,IsContaining,包含 |
之间 | 之间,IsBetween |
ENDING_WITH | EndingWith、IsEndingWith、EndsWith |
存在 | 存在 |
错误的 | 假的,是假的 |
比...更棒 | 大于,大于 |
GREATER_THAN_EQUALS | 大于等于,大于等于 |
在 | 在,伊辛 |
是 | 是,等于,(或没有关键字) |
是空的 | 是空的,空的 |
IS_NOT_EMPTY | IsNotEmpty, NotEmpty |
IS_NOT_NULL | NotNull,IsNotNull |
一片空白 | 空,是空 |
少于 | 小于,小于 |
LESS_THAN_EQUAL | 小于等于,小于等于 |
喜欢 | 喜欢,喜欢 |
靠近 | 近,近 |
不是 | 不,不是 |
NOT_IN | 不在,不在 |
不喜欢 | 不喜欢,不喜欢 |
正则表达式 | 正则表达式,匹配正则表达式,匹配 |
从...开始 | 开始于,开始于,开始于 |
真的 | 真的,是真的 |
内 | 内,是内 |
没什么神秘的,而且有据可查,完全诚实。 您提到的称为派生查询,它基本上从方法名称中推断出 JPQL 查询。 一个简单的谷歌搜索可以找到相当多的这个特性的文档。 Spring Data JPA 文档也清楚地记录了这一点及其用法。 在这里查看更多信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.