Spring jpa jpql查询

Posted

技术标签:

【中文标题】Spring jpa jpql查询【英文标题】:Spring jpa jpql query 【发布时间】:2017-11-30 17:58:51 【问题描述】:

我想知道是否可以通过 spring jpa 存储库执行 jpql 查询并能够使用分页作为排序功能,因为它可以通过 ExampleSpecification .我想做类似的事情:

findAll(String jpql, Pageable pageable)

QueryByExampleExecutor 接口即声明:

findAll(Example<S> example, Pageable pageable);

JpaSpecificationExecutor 接口声明:

Page<T> findAll(Specification<T> spec, Pageable pageable);

【问题讨论】:

【参考方案1】:

根据Spring Data documentation,即使使用本机查询也应该是可能的。看一下示例 51:

public interface UserRepository extends JpaRepository<User, Long> 

  @Query(value = "SELECT * FROM USERS WHERE LASTNAME = ?1",
    countQuery = "SELECT count(*) FROM USERS WHERE LASTNAME = ?1",
    nativeQuery = true)
  Page<User> findByLastname(String lastname, Pageable pageable);

似乎也可以按照documentation进行排序:

public interface UserRepository extends JpaRepository<User, Long> 

  @Query("select u from User u where u.lastname like ?1%")
  List<User> findByAndSort(String lastname, Sort sort);

  @Query("select u.id, LENGTH(u.firstname) as fn_len from User u where u.lastname like ?1%")
  List<Object[]> findByAsArrayAndSort(String lastname, Sort sort);

【讨论】:

感谢您的回答,但我一直在寻找的是动态创建查询并在代码中调用存储库,您的替代方案需要已经预定义的查询 即时编写 JPQL,可能有问题。 JPQL 在运行时编译,但仅在类加载阶段编译,因此如果您有错误,您的存储库将不会加载。这是一个很好的安全措施。您可以尝试使用 Criteria Query 代替:***.com/questions/28874135/…

以上是关于Spring jpa jpql查询的主要内容,如果未能解决你的问题,请参考以下文章

Spring JPA 和 Hibernate 的 JPQL 查询错误

没有 JPQL 查询的 Spring-data-jpa 中的 CURRENT_DATE

如何在 JPQL(Spring JPA 查询)中使用 JOIN 执行 UPDATE 语句?

无法在 FROM 子句中使用子查询编写 JPQL 查询 - Spring Data Jpa - Hibernate

无法在 FROM 子句中使用子查询编写 JPQL 查询 - Spring Data Jpa - Hibernate

Spring Boot JPA:为同一参数传递多个值 (JPQL)