我有一个名为JPQL的查询,我想在Spring Data存储库界面中使用它。此外,我想让它只返回第一个结果,如果没有匹配的结果则返回null。
根据我的判断,没有办法限制JPQL查询中的结果数量。我不能将返回类型声明为实体类,因为如果查询返回多个结果,则会抛出IncorrectResultSizeDataAccessException
。
对于常规(非JPQL)查询方法,使用关键字first
或top
(详见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问题跟踪器中找不到任何内容,但我的搜索功能可能让我失望。
答案 0 :(得分: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);