gpt4 book ai didi

java - 当我可以在 Spring JPA 中编写方法时为什么还需要 @Query

转载 作者:行者123 更新时间:2023-12-02 02:45:19 25 4
gpt4 key购买 nike

我刚刚开始使用 Spring JPA,正在审查同事编写的代码。我看到他一直在使用以下代码来使用用户名查找登录对象:

public interface LoginDao extends JpaRepository<Login, Long> {
@Query("SELECT u FROM Login u WHERE LOWER(u.username) = LOWER(:username)")
Login findByUsername(@Param("username") String username);
}

他不能创建一个这样的方法吗:

@GET
@Path("{username}")
public Login getOne(@PathParam("username") String username) {
Login login = loginDao.findOne(username);
if (login == null) {
throw new WebApplicationException(Response.Status.NOT_FOUND);
} else {
return login;
}
}

使用 @Query 而不是编写方法的根本优势是什么?或者我完全错了,两者都有不同的目的。

我个人不想在代码中编写查询。我认为将 java 与 sql 查询混合在一起会使代码看起来更难看。

我们的堆栈是 java、JPA、Jersey、JAX-RS、Postgreql、Spring Boot、Hibernate

问候

最佳答案

首先,这不是 SQL 查询,这是 JPQL 查询。如果 nativeQuery 则它将是 native SQL 查询属性设置为 true ,默认情况下并非如此。

使用 JPQL 创建查询非常好,您将能够毫无问题地从 Hibernate 切换到 Eclipse Link 或其他 JPA 实现。您还应该能够从 Postgres 切换到 MySQL、SQL Server...

如果您的同事使用@Query(nativeQuery = true, value = "...")创建查询,您必须开始担心,否则对我来说看起来不错。

其次,当您查看存储库声明时,您可以看到 Login 的 ID 字段。实体的类型为Long 。这意味着loginDao.findOne(..)方法需要 Long范围。可能是一个代理键,但不是 username .

这就是您的同事创建此新方法的原因:查找 LoginLong 以外的其他内容行代理键。 (这里的用户名很可能是业务 key ,但我不知道您的应用程序。)

<小时/>

仅供您引用:Spring 使用您的存储库方法的签名自动创建查询(派生查询)。例如:

public interface LoginDao extends JpaRepository<Login, Long> {
Login findByUsername(String username);
}

Spring JPA 将自动创建一个查询,查找名为 username 的字段并创建一个 WHERE子句。

请注意,它与您的同事查询相同,因为它不会使用 LOWER功能。

JPA 文档中有关这些派生查询的一些 anchor :

<小时/>

关于你的头衔的另一件事:

“当我可以在 Spring JPA 中编写方法时,为什么还需要 @Query”

嗯,这个@Query在 Spring JPA 中编写一个方法。 :^)

关于java - 当我可以在 Spring JPA 中编写方法时为什么还需要 @Query,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44652620/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com