It's very common see a generic's DAO implementation like this:
public List<E> getResultList(String namedQuery, Map<String, Object> parameters) {
Query query = entityManager.createNamedQuery(namedQuery);
parameters.entrySet().forEach(e -> query.setParameter(e.getKey(), e.getValue()));
return query.getResultList();
}
I have some problems with this approach:
- Using a complex structure to just pass a list of key & value data.
- Map creation is very verbose.
Example:
public List<TransacaoTEF> getActiveTransactions1(TipoMensagem tipoMensagem, LocalDate date) {
Map<String, Object> parameters = new HashMap<>();
parameters.put("type", tipoMensagem);
parameters.put("date", date);
return getResultList("namedQueryXTPO", parameters);
}
To avoid this I thought in create a simple Parameter class:
public List<E> getResultList(String namedQuery, Parameter... parameters) {
Query query = entityManager.createNamedQuery(namedQuery);
Arrays.stream(parameters).forEach(p -> query.setParameter(p.getName(), p.getValue()));
return query.getResultList();
}
public List<E> getResultList(String namedQuery, List<Parameter> parameters) {
Query query = entityManager.createNamedQuery(namedQuery);
parameters.forEach(p -> query.setParameter(p.getName(), p.getValue()));
return query.getResultList();
}
Using:
public List<TransacaoTEF> getActiveTransactions2(TipoMensagem tipoMensagem, LocalDate date) {
return getResultList("namedQueryXTPO",
new Parameter("type", tipoMensagem), new Parameter("date", date));
}
public List<TransacaoTEF> getActiveTransactions3(TipoMensagem tipoMensagem, LocalDate date) {
List<Parameter> parameters = Arrays.asList(
new Parameter("type", tipoMensagem),
new Parameter("date", date));
return getResultList("namedQueryXTPO", parameters);
}
It's over engineering or just paranoia ;p ?