È molto comune vedere un'implementazione DAO di un generico come questa:
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();
}
Ho alcuni problemi con questo approccio:
- Utilizzare una struttura complessa per passare semplicemente un elenco di chiavi e amp; dati di valore.
- La creazione della mappa è molto dettagliata.
Esempio:
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);
}
Per evitare ciò ho pensato di creare una semplice classe Parameter:
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();
}
Utilizzo:
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);
}
È finita l'ingegneria o solo paranoia; p?