【问题标题】:Spring Data JPA Query string composing (query for very many or all fields)Spring Data JPA 查询字符串组成(查询非常多或所有字段)
【发布时间】:2016-08-31 11:41:44
【问题描述】:

Spring Data JPA @Query 为 SQL 查询编写简短的声明非常方便。

public interface UserRepository extends JpaRepository<User, Long> {

  @Query("select u from User u where u.firstname like %?1")
  List<User> findByFirstnameEndsWith(String firstname);
}

甚至还有Query By Example

Person person = new Person();                         
person.setLastname("Smith");                          
Example<Person> example = Example.of(person);
List<Person> results = personRepository.findAll(example);

但是一般查询组合应该使用什么方法? 例如当使用多个字段或为一个字段使用多个可能值时。

在我们编写 HSQL 查询字符串之前,感觉很自然, 但是我没有看到将它添加到 Repository 的好方法,它是 Java 接口,机器人类。

【问题讨论】:

标签: java sql spring jpa


【解决方案1】:

我实际上没有看到使用第二种方式的充分理由,因为第一种方式写起来很清楚,也很容易理解。而且在第二种方式中,您将需要创建一个对象集值,然后调用存储库来为您查找人员。它应该找到输入到对象中的所有值,然后进行处理。而是定义一个查询,该查询仅对定义的列进行操作并为您提供结果。所以第一种方式本身比第二种方式更有意义。

谢谢。

【讨论】:

    【解决方案2】:

    只要您的查询很简单就足够了。当它们变得复杂和/或动态时,需要一些其他方法。

    开箱即用的 Spring Data 提供了 Specifications API,这是一种为查询指定谓词的相对简单的方法。

    更强大的方法是 Querydsl。它的优点是类型安全和代码可读性。

    【讨论】:

      【解决方案3】:

      根据每个场景的用例,使用所有可用的。我使用简单的查询名称(没有@Query 注释),然后我使用@Query 更复杂的注释,我使用QueryByExample 进行搜索,最后....

      如果您确实需要,您可以创建自己的存储库实现。如果您认为这是最好的方法,您可以在这里编写自己的 HQL。有些人会告诉你不要这样做,因为它会将你与 Hibernate 的使用联系起来(但说真的,你真正改变 ORM 提供者的几率是多少?)

      http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.custom-implementations

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-01-30
        • 2018-12-14
        • 1970-01-01
        • 2016-01-31
        • 2018-10-31
        • 2016-06-03
        • 2016-01-08
        相关资源
        最近更新 更多