如何使用依赖于可选字段的 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);
}
}
假设我有以下数据库实体:
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);
}
}