从List <object []> JPA </object []> </entity>检索List <entity>

时间:2014-04-25 20:42:20

标签: java jpa jpql

我有一个Entity类calle Publication,一个名为getAllPublication的方法返回List<Publication>,但我在方法中的查询有一个类型为List<Object[]>的resultList,如何从中查找发布实体列表List<Object[]>: - 方法:

public List<Publication> getAllPublication() {
    List<Object[]> listePublication;
    Query q;
    em.getTransaction().begin();
    q=em.createQuery("SELECT c.titrePublication,
    c.datePublication, c.corps,p.login FROM Publication c  JOIN c.employee p ");
    listePublication = q.getResultList();
    //ArrayList<Publication> results = new ArrayList<Publication>();
    //for (Object[] resultat : listePublication)
    //results.add((Publication) resultat[0]);*/
    em.getTransaction().commit();
    return results;
}
提前谢谢。 这是实体类

 package entities;

import java.io.Serializable;
import javax.persistence.*;

@Entity
@NamedQuery(name="Publication.findAll", query="SELECT p FROM Publication p")
public class Publication  {


    @Id
    @Column(name="\"idPublication\"")
    private Integer idPublication;

    private String corps;

    @Column(name="\"datePublication\"")
    private String datePublication;

    @Column(name="\"titrePublication\"")
    private String titrePublication;

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="auteur")
    private Employee employee;

    public Publication() {
    }

    public Integer getIdPublication() {
        return this.idPublication;
    }

    public void setIdPublication(Integer idPublication) {
        this.idPublication = idPublication;
    }

    public String getCorps() {
        return this.corps;
    }

    public void setCorps(String corps) {
        this.corps = corps;
    }

    public String getDatePublication() {
        return this.datePublication;
    }

    public void setDatePublication(String datePublication) {
        this.datePublication = datePublication;
    }

    public String getTitrePublication() {
        return this.titrePublication;
    }

    public Employee getEmployee() {
        return employee;
    }

    public void setEmployee(Employee employee) {
        this.employee = employee;
    }

    public void setTitrePublication(String titrePublication) {
        this.titrePublication = titrePublication;
    }
}

3 个答案:

答案 0 :(得分:0)

尝试

public List<Publication> getAllPublication() {
    TypedQuery<Publication> query = em. createNamedQuery(Publication.FIND_ALL, Publication.class);
    return query.getResultList();
}

您的实体看起来像:

 package entities;

import java.io.Serializable;
import javax.persistence.*;

@Entity
@NamedQuery(name=Publication.FIND_ALL, query="SELECT p FROM Publication p")
public class Publication  {

    public static final String FIND_ALL = "Publication.findAll";

    @Id
    @Column(name="\"idPublication\"")
    private Integer idPublication;

    private String corps;

    @Column(name="\"datePublication\"")
    private String datePublication;

    @Column(name="\"titrePublication\"")
    private String titrePublication;

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="auteur")
    private Employee employee;

    public Publication() {
    }

    public Integer getIdPublication() {
        return this.idPublication;
    }

    public void setIdPublication(Integer idPublication) {
        this.idPublication = idPublication;
    }

    public String getCorps() {
        return this.corps;
    }

    public void setCorps(String corps) {
        this.corps = corps;
    }

    public String getDatePublication() {
        return this.datePublication;
    }

    public void setDatePublication(String datePublication) {
        this.datePublication = datePublication;
    }

    public String getTitrePublication() {
        return this.titrePublication;
    }

    public Employee getEmployee() {
        return employee;
    }

    public void setEmployee(Employee employee) {
        this.employee = employee;
    }

    public void setTitrePublication(String titrePublication) {
        this.titrePublication = titrePublication;
    }
}

答案 1 :(得分:0)

您需要通过执行以下操作来创建类型化查询:

TypedQuery<Publication> q;
em.getTransaction().begin();
q=em.createQuery("SELECT c.titrePublication,
    c.datePublication, c.corps,p.login FROM Publication c  JOIN c.employee p ", 
    Publication.class);

编辑:正如其他答案所示,查询也需要更改以返回发布表中的所有内容。

答案 2 :(得分:0)

JPA提供SqlResultSetMapping and resultClass,允许您将原始查询的任何回复映射到实体

您必须在出版物中定义查询NamedNativeQuery

@NamedNativeQuery(name="findPublication", query="SELECT c.titrePublication, c.datePublication, c.corps,p.login FROM Publication c  JOIN c.employee p", resultClass=Publication.class)

登录属性未在Publication类中定义,您需要在发布中使用getter / setter添加登录peroperty,因为您使用join从employee表中选择登录