Вложенная проекция в QueryDSL (mysema)

Я пишу запрос с mysqma.querydsl версии 4.1.4, и мне нужно спроектировать прямые свойства (attrs) и вложенные свойства и некоторые атрибуты этих вложенных свойств, а не все attrs.

У меня есть две сущности:

@Entity
@Table(name = "p_libro_visado", schema = "lab", catalog = "catastro")
public class PLibroVisadoEntity {
    private long id;
    private int cantLamina;
    private Integer idLibro;
    private TipovisadoEntity tipovisado;

    @Id
    @Column(name = "id")
    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    @Basic
    @Column(name = "cant_lamina")
    public int getCantLamina() {
        return cantLamina;
    }

    public void setCantLamina(int cantLamina) {
        this.cantLamina = cantLamina;
    }

    @Basic
    @Column(name = "id_libro")
    public Integer getIdLibro() {
        return idLibro;
    }

    public void setIdLibro(Integer idLibro) {
        this.idLibro = idLibro;
    }

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "id_tipo_visado", referencedColumnName = "id", nullable = false)
    public TipovisadoEntity getTipovisado() {
        return tipovisado;
    }

    public void setTipovisado(TipovisadoEntity tipovisadoByIdTipoVisado) {
        this.tipovisado = tipovisadoByIdTipoVisado;
    }
}

а также

@Entity
@Table(name = "tipovisado", schema = "lab", catalog = "catastro")
public class TipovisadoEntity {
    private long id;
    private String abreviacion;
    private String nombre;
    private Integer orden;
    private Collection<PLibroVisadoEntity> libroVisados;

    @Id
    @Column(name = "id")
    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    @Basic
    @Column(name = "abreviacion")
    public String getAbreviacion() {
        return abreviacion;
    }

    public void setAbreviacion(String abreviacion) {
        this.abreviacion = abreviacion;
    }

    @Basic
    @Column(name = "nombre")
    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    @Basic
    @Column(name = "orden")
    public Integer getOrden() {
        return orden;
    }

    public void setOrden(Integer orden) {
        this.orden = orden;
    }

    @OneToMany(mappedBy = "tipovisado")
    public Collection<PLibroVisadoEntity> getpLibroVisados() {
        return libroVisados;
    }

    public void setpLibroVisados(Collection<PLibroVisadoEntity> pLibroVisadosById) {
        this.libroVisados = pLibroVisadosById;
    }
}

И мой запрос:

QPLibroVisadoEntity e = QPLibroVisadoEntity.pLibroVisadoEntity;
QTipovisadoEntity t = QTipovisadoEntity.tipovisadoEntity;

JPAQuery<?> query = factory.query();

return query.select(                  Projections.bean(PLibroVisadoEntity.class, e.tipovisado, e.idLibro,
Projections.bean(TipovisadoEntity.class, e.tipovisado.nombre)
)).from(e).fetch().stream();

Но это, бросает исключение:

Это исключение:

Tests run: 1, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 3.319 sec <<< FAILURE!
testFindAll(ar.gov.sf.commons.repository.JpaAsyncRepositoryTest)  Time elapsed: 2.673 sec  <<< FAILURE!
java.lang.IllegalArgumentException: Unsupported expression new TipovisadoEntity(pLibroVisadoEntity.tipovisado.nombre)
    at com.querydsl.core.types.QBean.createBindings(QBean.java:75)
    at com.querydsl.core.types.QBean.<init>(QBean.java:129)
    at com.querydsl.core.types.QBean.<init>(QBean.java:118)
    at com.querydsl.core.types.Projections.bean(Projections.java:68)
    at ar.gov.sf.commons.repository.JpaAsyncRepository.findAll(JpaAsyncRepository.java:112)
    at ar.gov.sf.commons.repository.JpaAsyncRepositoryTest.testFindAll(JpaAsyncRepositoryTest.java:48)

Есть идеи, как исправить этот код?

Спасибо!!!

0 ответов

Другие вопросы по тегам