如何处理空参数的JPA Query方法中的所有枚举值

时间:2019-02-19 11:46:11

标签: java hibernate jpa spring-data-jpa spring-data

我有一个JPA方法,可以按学生的毕业状态查找他们的名单。

List<Student> findAllByStatus(Status status);

但是,如果请求的状态为空,则我想检索状态为空的实体。

如何使用JPARepository仅使用一个方法查询来处理此问题,如果状态为null则无法按状态进行过滤?

谢谢。

4 个答案:

答案 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)