Bom dia.
Como posso eliminar esta duplicação, da melhor forma, utilizando boas práticas?
Método:
public Usuario consultarUsuario(String codigo, String email) {
StringBuilder consulta = new StringBuilder("select usuario from Usuario as u where ");
if(isParametroNaoNulo(codigo)) {
consulta.append("u.codigo = :codigo");
}
if(isCodigoEEmailNaoNulo(codigo, email)) {
consulta.append(" and ");
}
if(isParametroNaoNulo(email)) {
consulta.append("u.email = :email");
}
Query query = entityManager.createQuery(consulta.toString());
if(isParametroNaoNulo(codigo)){
query.setParameter("codigo", codigo);
}
if(isParametroNaoNulo(email)){
query.setParameter("email", email);
}
return query.getSingleResult();
}
Código duplicado:
if(isParametroNaoNulo(codigo)) {
consulta.append("u.codigo = :codigo");
}
if(isParametroNaoNulo(email)) {
consulta.append("u.email = :email");
}
e
if(isParametroNaoNulo(codigo)){
query.setParameter("codigo", codigo);
}
if(isParametroNaoNulo(email)){
query.setParameter("email", email);
}
Você poderia fazer uma classe para gerenciar seus SQLs, algo do tipo:
private StringBuilder where;
private void addWhere( String coluna, String chave ){
if( coluna != null && coluna.length() > 0 &&
chave != null && chave.length() > 0){
if (where.length() != 0)
where.append(" and ");
where.append(coluna + " = :" + chave);
}
}
Acredito que exista algo do tipo, ou até melhor, mas eu não conhesso é que eu uso hibernate mesmo rsrs Mas se descobrir algo poste aqui
Obrigado pela resposta, magostta. Vou pegar carona na sua idéia e bolar algo aqui. Aproveitando sua boa vontande, sabe como eu poderia me livrar deste tipo de duplicação também?
try {
//trecho de código qualquer
} catch (Exception e) {
return e.getMessage();
}
exemplo:
[code] public String inserir(usuario) {
try {
return metodo1;
} catch (Exception e) {
return e.getMessage();
}
}
public String alterar(usuario) {
try {
return metodo2;
} catch (Exception e) {
return e.getMessage();
}
}[/code]
Obrigado pela resposta, wbdsjunior. Infelizmente, por padrão aqui, não posso utilizar Criteria. Não me pergunte porque. :?
novato25:
Obrigado pela resposta, wbdsjunior. Infelizmente, por padrão aqui, não posso utilizar Criteria. Não me pergunte porque. :?
você pode usar o padrão Builder .
Você pode usar o throws pra resolver a duplicação dos blocos try catch
De uma boa estudada nele, é muito importante
Bom dia não sei se já foi tratado mas vc poderá ter um problema caso os 2 parametros forem nulos, devido ter incluso o WHERE antes…
Deveria incluir com um condição tambem