2016-11-09 110 views
0

我有一个名为JPQL的查询,我想在Spring Data repository接口中使用它。此外,我会让它返回第一个结果,如果没有匹配的结果,则返回null。我可以限制使用JPQL命名查询的Spring Data查询方法的查询结果吗?

从我已经能够确定的,没有办法限制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 issue tracker中找到任何内容,但是我的搜索fu可能会让我失望。

回答

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);