我可以限制使用 JPQL 命名查询的 Spring Data 查询方法的查询结果吗?

Posted

技术标签:

【中文标题】我可以限制使用 JPQL 命名查询的 Spring Data 查询方法的查询结果吗?【英文标题】:Can I limit query results of a Spring Data query method that uses a JPQL named query? 【发布时间】:2017-03-22 20:29:11 【问题描述】:

我有一个命名的 JPQL 查询,我想在 Spring Data 存储库接口中使用它。此外,我希望它只返回第一个结果,如果没有匹配的结果,则返回 null。

据我所知,无法限制 JPQL 查询中的结果数量。我不能只将返回类型声明为实体类,因为如果查询返回多个结果,则会抛出 IncorrectResultSizeDataAccessException

对于常规(非 JPQL)查询方法,使用关键字firsttop(详见Spring Data JPA docs)。通过指定与命名查询名称匹配的方法名称,可以将命名查询包含在存储库接口中(同样,如Spring Data JPA docs 中所述)。但是,我看不到将这两者结合起来的任何方法:只返回存储库接口中命名查询的第一个结果。

这是一个具体的例子:

public interface ExampleRepository extends JpaRepository<Example, Integer> 
    // Using "first" or "top" can return just the first value
    Example findFirstByValueNotOrderByValueDesc(String value);

    // Using the "Example.findMatchingComplicatedCriteria" named query to return all matching values
    List<Example> findMatchingComplicatedCriteria(@Param("value") String value);

    // TODO: How do I make something like this work?
    // Example firstFindMatchingComplicatedCriteria(@Param("value") String value);


@Entity
@NamedQuery(name = "Example.findMatchingComplicatedCriteria",
        query = "SELECT e from Example e WHERE e.value <> :value ORDER BY e.value DESC")
public class Example 
    @Id public Integer id;
    public String value;

我知道我可以直接使用 EntityManager,但如果可能的话,我想直接从存储库界面完成这一切。另一种解决方法是让存储库返回列表,并让我的应用程序代码提取第一个元素;再次,我想知道我是否可以避免。我也知道我可以使用本机查询来实现此功能。

最终,我的问题是:我可以让 Spring Data 存储库接口方法使用命名查询并返回单个结果吗?除此之外,这是否存在问题?我在 Spring Data 问题跟踪器中没有找到任何内容,但我的搜索结果可能让我失望了。

【问题讨论】:

使用与未命名查询相同的技术。看看***.com/a/34640835/355438 【参考方案1】:

使用@Query(named="")

@Query(named="Example.findMatchingComplicatedCriteria")
List<Example> findFirstMatchingComplicatedCriteria(@Param("value") String value);

另一种方法是使用Pageable:使用页面0,并使用页面大小作为限制

 List<Example> findMatchingComplicatedCriteria(@Param("value") String value, Pageable pageable);

 Pageable pageable = new PageRequest(0, 10);

【讨论】:

以上是关于我可以限制使用 JPQL 命名查询的 Spring Data 查询方法的查询结果吗?的主要内容,如果未能解决你的问题,请参考以下文章

可以在一个 JPQL 查询中传递多个命名实体图?

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

JPQL:多重连接。如何做我的命名查询?

Spring jpa jpql查询

如何在JPQL中创建“findBy Date”命名查询?

在 Spring Boot 中使用 ':' 作为查询字符串的一部分编写 JPQL 查询