Erro ao retornar dados do banco

Fala pessoal, estava fazendo uns testes na minha tabela e na consulta dela e vi que estava carregando todos os campos, quando na verdade só preciso de 4 (estava trazendo mais de 10 campos antes e isso estava travando meu programa), fiz a jpql nova para poder trazer só o que preciso mas esta me retornando este erro agora → Cannot create TypedQuery for query with more than one return using requested result type [br.com.infoarte.commons.model.produto.Produto]

minha Query e o construtor que eu chamo nas tabelas é este;

//Construtor que é chamado nas classe que tem tabela para popular a mesma;
public <T> ConsultasSql(JTable table, Class<T> classe, String className, String fieldsToSearch, JComboBox<?> box,JTextField field) {
		logger.info("Populando a tabela");
		consultaAll(table,classe,className,fieldsToSearch,box,field);
		consultaLike(table,classe,className,fieldsToSearch,box,field);
    }
	
	//chama a consulta 'like' e faz a validação para só buscar quando tiver 3 caracteres digitados
	private<T> void consultaLike(JTable table, Class<T> classe, String className, String fieldsToSearch, JComboBox<?> box,JTextField field) {
		logger.debug("Iniciando consulta");
			field.addKeyListener(new KeyAdapter() {
				public void keyReleased(KeyEvent ev) {
						List<T> classes;
						TypedQuery<T> queryLike = em.createQuery("SELECT "+ fieldsToSearch +" FROM "+className
								+" e WHERE upper(CAST(e."+getColunmNameFromComboBox(box)+" as string))"
								+" like '%"+field.getText().toUpperCase()+"%'",classe);
						classes = queryLike.getResultList();
						changeClass(classe, table, classes);
				}
			});
	}
	
	//Quando o campo de busca estiver vazio este sera o método retornado
	private<T> void consultaAll(JTable table, Class<T> classe, String className, String fieldsToSearch, JComboBox<?> box,JTextField field) {
		logger.debug("Iniciando consulta");
		if(field.getText().isEmpty() || field.getText().length() <= 3) {
			List<T> classes;
			TypedQuery<T> queryAll = em.createQuery("SELECT "+ fieldsToSearch +" FROM "+className+" e", classe);
			classes = queryAll.getResultList();
			changeClass(classe, table, classes);
		}
	}

Exemplo da chamada:

private JTable getTableProduto() {
		if (tableProduto == null) {
			tableProduto = new JTable();tableProduto.setAutoCreateRowSorter(true);
			tableProduto.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
			tableProduto.setModel(new ProdutoTableModel(new ArrayList<Produto>()));
			tableProduto.getColumnModel().getColumn(0).setPreferredWidth(20);
			tableProduto.getColumnModel().getColumn(1).setPreferredWidth(150);
			tableProduto.getColumnModel().getColumn(2).setPreferredWidth(40);
			tableProduto.getColumnModel().getColumn(3).setPreferredWidth(10);
			new ConsultasSql(tableProduto,Produto.class,"Produto","prodDesc, precoLista, custoMedio",comboBoxProdSearch,textFieldProdSearch);
		}
		return tableProduto;
	}

Procurei bastante por esse erro aqui no Guj e em fóruns gringos, mas nada de achar uma solução, eu teria que mudar o tipo de consulta, ou tem alguma outra forma de resolver isso? e o que exatamente seria esse erro?

Para teres uma TypedQuery, o teu SELECT tem de devolver mesma entidade (class) que declaras no segundo parâmetro do método createQuery.

No teu caso seria algo assim

TypedQuery<T> queryLike = em.createQuery("SELECT new " + classeName +" ("+ fieldsToSearch +") FROM "+className
    +" e WHERE upper(CAST(e."+getColunmNameFromComboBox(box)+" as string))"
	+" like '%"+field.getText().toUpperCase()+"%'",classe);

E tens de garantir que em todas as classes que vais fazer select tens o construtor adequado para usar aqui.

1 curtida