如何使用依赖于可选字段的 Panache 构建查询?

How to build a query with Panache which depends on optional fields?

假设我有以下数据库实体:

Customer
- firstname
- lastname
- status (active | inactive)
- email

以及以下(简化的)Java 方法:

getCustomers (String firstname, String lastname, String status, String email) {...}

如果所有字符串都是空的,我想从数据库中检索所有记录。如果 lastname 和 status 有值,我想检索相关记录。等等。因此,在创建查询时,我需要检查字段是否有值,然后将这些字段添加到数据库查询中。我如何使用 Quarkus Panache 最好地实现它?

我认为没有特定的方法可以做到这一点,但是如果您将参数传递为 Map<String, Object>:

public List<Customer> getCustomers(Map<String, Object> parameters)
    if ( parameters == null ) {
        return Customer.listAll();
    }

    Map<String, Object> nonNullParams = parameters.entrySet().stream()
        .filter( entry -> entry.getValue() != null )
        .collect( Collectors.toMap( Map.Entry::getKey, Map.Entry::getValue ) );

    if ( nonNullParams.isEmtpty() ) {
        return Customer.listAll();
    }

    String query = nonNullParams.entrySet().stream()
            .map( entry -> entry.getKey() + "=:" + entry.getKey() )
            .collect( Collectors.joining(" and ") );

    return Customer.find(query, nonNullParams);
}

public List<Customer> getCustomers (String firstname, String lastname, String status, String email) {
    Map<String, Object> parameters = new HashMap<>();
    addIfNotNull(parameters, "firstName", firstName );
    addIfNotNull(parameters, "lastName", lastName );
    addIfNotNull(parameters, "status", status );
    addIfNotNull(parameters, "email", email );

    if ( parameters.isEmtpty() ) {
        return Customer.listAll();
    }

    String query = parameters.entrySet().stream()
            .map( entry -> entry.getKey() + "=:" + entry.getKey() )
            .collect( Collectors.joining(" and ") );
    return Customer.find(query, parameters)
}

private static void addIfNotNull(Map<String, Object> map, String key, String value) {
    if (value != null) {
        map.put(key, value);
    }
}