如何从Spring JPA中的方法名称关闭查询创建?

时间:2014-01-14 01:13:46

标签: java spring spring-data spring-data-jpa

在Spring Data中,是否可以从方法名称关闭查询生成?

给定界面

public interface UserRepository extends Repository<User, Long> {

  List<User> findByEmailAddressAndLastname(String emailAddress, String lastname);
}

我希望spring security能够产生一个错误,说明从方法名称生成查询已被关闭,请使用显式的@Query注释。

public interface UserRepository extends Repository<User, Long> {

  @Query("select u from User u where u.emailAddress = ?1 and u.lastname = ?2")
  List<User> findByEmailAddressAndLastname(String emailAddress, String lastname);
}

我想关闭自动查询生成,因为我认为更容易阅读查询并知道发生了什么,而不是阅读方法名称并转换为Spring数据将生成的查询,也是一个拥有大量开发人员的大型团队,有些人可能还不熟悉Spring数据@Query更具可读性?

如何从Spring JPA中的方法名称关闭查询创建?

2 个答案:

答案 0 :(得分:6)

您可以在配置中的query-lookup-strategy标记上指定repositories

<repositories query-lookup-strategy="use-declared-query"/>

请参阅documentation

<强> User.java

@Entity
@NamedQuery(name="User.findByEmailAddressAndLastName",
    query="select u from User u where u.emailAddress = ?1 and u.lastname = ?2")
public User{


}

<强> UserRepository.java

public interface UserRepository extends Repository<User, Long> {

  List<User> findByEmailAddressAndLastname(String emailAddress, String lastname);
}

答案 1 :(得分:2)

Spring如何处理这个问题称为查询查询策略。查询可以通过方法名称(CREATE),手动查询(USE_DECLARED_QUERY)或两者(CREATE_IF_NOT_FOUND)来解析,如果未找到手动查询,则默认为方法名称。 USE_DECLARED_QUERY会为您提供所需的功能,如果未指定手动查询,则会发出警告。

Kevin回答说,这可以在xml中配置。但作为一个更现代的选项,您可以在使用queryLookupStrategy注释中的@Enable{store}Repositories参数在Java Config类中配置存储库时指定查找策略。

例如,要强制手动查询,您可以使用以下内容:

@EnableJpaRepositories(queryLookupStrategy=QueryLookupStrategy.Key.USE_DECLARED_QUERY)
public class MyDatabaseConfig {
    ...
}

此处有更多信息