Como eliminar esta duplicação?

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

com JPA Criteria.

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. :?

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