2

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

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

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

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

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

4

1 回答 1

3

我认为没有特定的方法可以做到这一点,但如果您将参数传递为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);
    }
}
于 2021-04-14T08:26:56.293 回答