Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Duvida sobre consulta JPQL

Opa pessoal, beleza. Gostaria de uma ajuda se possivel.

Tenho as seguintes entidades:

PurchaseModel:

@Entity(name = "purchase")
data class PurchaseModel(

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    var id: Int? = null,

    @Column
    var name: String? = null,

    @Column
    var value: BigDecimal,

    @ManyToOne
    @JoinColumn(name = "customer_id")
    var customer: CustomerModel? = null
)

CustomerModel

@Entity(name = "customer")
data class CustomerModel(

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    var id: Int? = null,

    @Column
    var email: String,

    @Column
    var password: String,

    @Column
    @Enumerated(EnumType.STRING)
    var status: CustomerStatus,

    @Column(name = "created_at")
    var createdAt: LocalDateTime = LocalDateTime.now(),
)

Gostaria de fazer uma consulta de Purchase da sequinte forma; Trazendo os dados dela e o id do usuario, porem a classe purchase tem um status.

Com a ajuda do spring JPA, ele já me da um metodo findByStatus, funciona bem, mas vejo que ele faz tres consultas no banco.

Então estou montando uma consulta jpql, mas ainda não funciona;

    @Query("from purchase p join fetch customer where p.status = :status")
    fun findByMyStatus(status: PurchaseStatus, pageable: Pageable): Page<PurchaseModel>

Me dá o sequinte erro:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'where purchasemo0_.status='FECHADA' limit 48' at line 1

Acho que estou fazendo da forma errada, se alguem puder me dá uma luz.

4 respostas

Olá Daniel,

Você pode postar o seu enum PurchaseStatus?

Opa Claro Klatus

enum class PurchaseStatus {
    ABERTA,
    CONCLUIDA,
    DELETADA
}

aqui esta

solução!

Daniel, de acordo com a mensagem de erro e com o enum que você postou, tem duas possibilidades aí:

  1. Você fez a query com 'p.status = :status' sendo que PurchaseModel não possui atributo status na classe. Apenas CustomerModel possui status.
  2. O status do CustomerModel é do tipo CustomerStatus, não o tipo PurchaseStatus que você postou!

Estou achando estranho porque o valor 'FECHADA' encontrado na cláusula apontada pela mensagem de erro (where purchasemo0.status='FECHADA) não é um valor válido no enum PurchaseStatus!

Das duas uma: ou você errou a query (a cláusula deveria ser 'c.status = :status'), ou você trocou sem querer o Enum do parâmetro no método findByMyStatus!

Verifique se não foi uma destas duas situações, ok?

Espero ter ajudado.

Opa meu caro, acredito que foi a questão do (where purchasemo0.status='FECHADA) Tinha esse status colocado no banco de dados de teste, ai ele não trazia nada por que não tem um enum que bate com esse status.

Meio obvio agora rsrs, mas putz, tarde da noite, muita coisa rolou antes disso ai pirei.

Obrigado meu caro, abraços.