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

É possivel fazer query de soma com JPQL?

Olá,

Estou tentando reescrever uma query nativa para JPQL, porem todas tentativas que tentei não funcionaram.

//esta é a query nativa (ela funciona)
@Query(value = "SELECT SUM(quantidade_ingressos) FROM cliente_ingressos "
            + "WHERE cliente_ingressos.evento_id = :eventoId" ,nativeQuery = true)

//tentei varias formas, mas esse é o JPQL que achei que estaria mais proximo da sintaxe correta (mas sempre é lançado BeanCreationException e diz que ela n tem como ser validada

@Query("SELECT SUM(ingressos.quantidadeIngressos) FROM Cliente c "
            + "WHERE c.ingressos.evento.id = :eventoId")

Classe cliente

@Entity
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Cliente{
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String nome;
    private String email;
    @ElementCollection
    @Embedded
    @Builder.Default
    private List<Ingresso> ingressos = new ArrayList<>();
}

classe ingresso

@Embeddable
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Ingresso {

    @ManyToOne
    private Evento evento;
    private BigDecimal valorIngresso;
    private Integer quantidadeIngressos;
}

classe evento

@Entity
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Evento {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String nome;
    private BigDecimal valor;
    @Enumerated(EnumType.STRING)
    private TipoDeEvento tipo;
    @ManyToOne (fetch = FetchType.EAGER)
    private Local local;
    private LocalDate dataEvento;
    private LocalTime horaEvento;
    private Integer quantidadeIngressos;
    private Integer quantidadeIngressosVendidos;
    private Integer quantidadeIngressosDisponiveis;
    private String caminhoImagemDoEvento;

}
2 respostas
solução!

Oi Ronald, acho que faltou um alias no join com ingressos:

@Query("SELECT SUM(ing.quantidadeIngressos) FROM Cliente c JOIN c.ingressos ing WHERE ing.evento.id = :eventoId")

Muito obrigado Rodrigo! Funcionou! Abraço.