我有一个JPA方法,可以按学生的毕业状态查找他们的名单。
List<Student> findAllByStatus(Status status);
但是,如果请求的状态为空,则我想检索状态为空的实体。
如何使用JPARepository仅使用一个方法查询来处理此问题,如果状态为null则无法按状态进行过滤?
谢谢。
答案 0 :(得分:2)
您应该使用类似的内容:
@Query("SELECT s from Student s WHERE (?1 is null or s.status = ?1)")
List<Student> findAllByStatus(Status status);
只需一点点解决Ankit Kanani答案。
答案 1 :(得分:1)
尝试
@Query("SELECT s from Student s WHERE (s.status is null or s.status =?1)")
List<Student> findAllByStatus(Status status);
答案 2 :(得分:0)
此方法涉及更多代码,但我认为这是您最好的选择:
@Override
public List<Interface> findAllWithFilters(String name, InterfaceType type, String ip)
{
Interface intfc = new Interface();
intfc.setName(name);
intfc.setType(type);
intfc.setIp(ip);
ExampleMatcher matcher = ExampleMatcher.matching()
.withMatcher("name", match -> match.contains())
.withMatcher("type", match -> match.exact())
.withMatcher("ip", match -> match.contains())
.withIgnorePaths("id", "uuid")
.withIgnoreNullValues();
Example<Interface> example = Example.of(intfc, matcher);
return ((InterfaceRepository) baseRepository).findAll(example);
}
.withIgnoreNullValues()是键。如果您发送空值而不是枚举常量,它将仅返回所有内容。
答案 3 :(得分:0)
JPA正在生成等号的SQL语句。在大多数DBMS中,将null与等号进行比较不起作用。而是需要is
关键字:
WHERE (s.status =?1 and ?1 is not null) or (s.status is null and ?1 is null)