Select "string vazia"

Estou com problemas para efetuar busca numa tabela do PostgreSQL utilizando o Hibernate. A tabela possui colunas que contém campos com ?string vazia? e o Hibernate retorna um erro quando traz um registro que contém uma “string vazia”

Detalhes do design da coluna no banco PostgreSQL:
Data type: character varying(20)
Default:
Not NULL? No

Na classe Java, a coluna está anotada assim:
@Column(name = “rg”)
private String rgCliente;

A query string abaixo funciona perfeitamente quando não existe uma “string vazia” no registro:
SELECT c FROM Cliente c WHERE c.id = 765432

E retorno em Json fica assim:
[{“id”:765432,“nomeCliente”:“FULANO DE TAL”,“rgCliente”:“234567890”}]

Quando altero a query para:
SELECT c.id, c.nomeCliente, c.rgCliente FROM Cliente c WHERE c.id = 765432

O Hibernate não retorna um objeto e sim um ArrayList. O resultado em Json fica sem a identificação das colunas:
[[765432,“FULANO DE TAL”,“234567890”]]

Para resolver o problema acima, alterei a query para retornar um objeto:
SELECT new ClienteDTO(c.id, c.nomeCliente, c.rgCliente) FROM Cliente c WHERE c.id = 765432

Porém o Hibernate não consegue instanciar o objeto ClienteDTO, quando o registro possui “string vazia”:
Java.lang.IllegalArgumentException: org.hibernate.QueryException: could not instatiate class [ClienteDTO] from tuple

Tentei utilizar o JPA Criteria Builder. Consegui utilizá-lo em consultas simples, mas devido a complexidade, não consegui implementar uma consulta que atendesse minha necessidade.

Não posso alterar o banco de dados e preciso que o Json seja retornado com as identificações das colunas.
As opções para implementar uma solução podem ser realizadas:

  • na query;
  • na anotação da classe;
  • ou tratando o resultado Json (caso seja possível).

Se alguém puder ajudar, agradeço,

Quando vc cria sua query com o DTO passa o nome completo da sua classe DTO

ex:

[quote=gustavorozolin]Quando vc cria sua query com o DTO passa o nome completo da sua classe DTO

ex:

O erro acontece quando tento istanciar o objeto com uma string vazia do banco. Estou tentando uma abordagem pelo JPA CriteriaBuilder.
Consegui montar uma entidade a partir de campos individuais através do código abaixo:

List<Cliente> clientes = null;

CriteriaBuilder cb = manager.getCriteriaBuilder();
CriteriaQuery<Cliente> cq = cb.createQuery(Cliente.class);
Root<Cliente> cliente = cq.from(Cliente.class);
Predicate condition = cb.equal(cliente.get("id"), id);
cq.where(condition);

cq.select(cb.construct(
Cliente.class,
cliente.<Long>get("id"),
cliente.<String>get("nomeCliente"),
cliente.<String>get("rgCliente")));

TypedQuery<Cliente> typed = manager.createQuery(cq);
clientes = typed.getResultList();

Porém, não estou conseguindo efetuar o selectCase() no campo rgCliente. Existem poucos exemplos de selectCase() com CriteriaBuilder.

Tentei substituir a última linha do select (cliente.get(“rgCliente”))) por:

cb.<String>selectCase()
.when(cb.equal(
cliente.<String>get("rgCliente"),
""),
cb.literal("NaoInformado"))
.otherwise(cb.literal("Informado")));

Mas não funcionou, não sei se a sintaxe está incorreta ou se o selectCase não funciona com a instrução “.construct”.

Resolvi o problema convertendo o ArrayList resultante da query:

String query = “SELECT c.id, c.nomeCliente, c.rgCliente FROM Cliente c WHERE c.id = '” + codigo + “’”;

Utilizando as linhas de código abaixo:

Cliente clie;
List clientes = new ArrayList();

List<Object[]> clientesObj = manager.createQuery(query).getResultList();

for (Object[] itemObj : clientesObj) {
cliente = new Cliente();

clie.setId(Long.parseLong(itemObj[0].toString()));
clie.setNomeCliente(itemObj[1].toString());
clie.setRgCliente(itemObj[2].toString());
	
clientes.add(clie);

}

return clientes;

Não ficou tão elegante, mas funcionou. Obrigado a todos pela atenção dispensada.