Tengo una clase de certificado que contiene una lista de clases de etiquetas

import javax.persistence.*;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Objects;

@Entity
@Table(name = "gift_certificate")
public class Certificate {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String description;
    private BigDecimal price;
    private Integer duration;
    @Column(name = "create_date")
    private LocalDateTime createDate;
    @Column(name = "last_update_date")
    private LocalDateTime lastUpdateDate;
    @ManyToMany
    @JoinTable(name = "gift_certificate_tag",
            joinColumns = @JoinColumn(name = "tag_id"),
            inverseJoinColumns = @JoinColumn(name = "gift_certificate_id")
    )
    private List<Tag> tags;
    
getters and setters and other code...

....

import javax.persistence.*;
import java.util.Objects;

@Entity
@Table(name = "tag")
public class Tag {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;

getters and setters and other code...

Y estoy tratando de obtener la Lista de certificados de DB usando JPA / Hibernate. Estoy usando EntityManager

public List<Tag> getCertificateTags(Long certificateId) {
    return entityManager.createQuery("select c.tags from Certificate c where c.id=:id")
            .setParameter("id", certificateId)
            .getResultList();
}

Y funciona, pero obtengo solo una lista, no una lista, e IDEA advierte Unchecked assignment: 'java.util.List' to 'java.util.List<Tag>'. Y cuando uso createQuery con el segundo parámetro Tag.class así:

entityManager.createQuery("select c.tags from Certificate c where c.id=:id", Tag.class)
                .setParameter("id", certificateId)
                .getResultList();

Obtengo java.lang.IllegalArgumentException: Type specified for TypedQuery [Tag] is incompatible with query return type [interface java.util.Collection]

¿Cómo puedo arreglarlo?

0
Igor Tsalko 25 ene. 2021 a las 09:05

1 respuesta

La mejor respuesta

Intenta cambiar la consulta de esta manera

select t from Certificate c join c.tags t where c.id=:id

El motivo es que select c.tags significa que cada fila de resultados contiene una lista de etiquetas . Pero cuando select t from Certificate c join c.tags t cada fila contiene una etiqueta

1
alex valuiskyi 25 ene. 2021 a las 07:44