3
respostas

[Dúvida] JPA HIBERNATE - Buscar uma conta bancária a partir de uma string dentro de uma arraylist.

Estou tentando buscar uma conta bancária a partir de uma chave pix em um banco de dados MySQL utilizando Hibernate porém não estou conseguindo construir o método que faz esse filtro, podem me ajudar?

Os atributos da classe Conta:

@Entity
@Table(name="contas")
@Inheritance(strategy =InheritanceType.SINGLE_TABLE)
public abstract class Conta {
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private static long somaContas = 0L;
    @Id 
    private Long numeroDaConta;
    private String agencia = "0001";
    @Enumerated(EnumType.STRING)
    private EnumConta tipoDeConta;
    @ManyToOne
    private Cliente cliente;
    public BigDecimal saldo = new BigDecimal("0");
    private String senha;

    private ArrayList<String> chavesPix = new ArrayList<>();                  <------------------------------------------------------- ArrayList contendo as chaves pix.

    @OneToOne(mappedBy = "contaMae", cascade =CascadeType.ALL)
    protected ExtratoBancario extrato = new ExtratoBancario(this);

O método que construi para buscar a Conta a partir da Chave Pix (fica na ContaDAO):

public Conta getByChavePix(String chave) {
        String jpql = "SELECT c FROM Conta c WHERE c.chavesPix IN :chave";

        return em.createQuery(jpql,Conta.class).setParameter("chave",chave).getSingleResult();
    }

Exception que estou recebendo:

Exception in thread "main" java.lang.IllegalArgumentException: Parameter value [chavepixteste] did not match expected type [java.util.ArrayList (n/a)]
3 respostas

Oi João!

Acho que se inverter o parâmetro na cláusula where resolve:

WHERE :chave IN c.chavesPix

Oi Rodrigo!

Infelizmente não encontrou , e tenho certeza que tem uma conta com essa chave pix gravada no banco de dados :(.

EXCEPTION

Exception in thread "main" javax.persistence.NoResultException: No entity found for query
    at org.hibernate.query.internal.AbstractProducedQuery.getSingleResult(AbstractProducedQuery.java:1667)
    at com.fourcamp.bancoOGP.dao.ContaDAO.getByChavePix(ContaDAO.java:32)
    at com.fourcamp.bancoOGP.App.main(App.java:48)

MÉTODO

public Conta getByChavePix(String chave) {
        String jpql = "SELECT c FROM Conta c WHERE :chave IN c.chavesPix";
        return em.createQuery(jpql,Conta.class).setParameter("chave",chave).getSingleResult();
    }

Como que as chaves estão sendo salvas na tabela?

O atributo na entidade Conta deveria estar anotado com @ElementCollection, para que seja criada uma tabela para armazenar as chaves pix e o id de suas respectivas contas:

@ElementCollection
@CollectionTable(name = "chaves_pix", joinColumns = @JoinColumn(name="conta_id"))
@Column(name = "chave")
private ArrayList<String> chavesPix = new ArrayList<>();  

Esse é o jeito certo de se mapear uma coleção de objetos que não são outras entidades JPA. Dessa forma a query vai funcionar corretamente ;)