JPA多选查询

时间:2011-07-27 09:43:54

标签: jpa jpa-2.0

我有这样的查询,如何从列表中获取我的实体类型?它像对象一样返回,但是当我转换为我的实体时,它不会被强制转换。

我的桌子:B(id_A, id_C) , A(id_A,name,location) C (id_C,......)

        String queryCompany = "select s.name,s.location from B b," +
                " A s where b.bPK.id_A=s.id_A " +
                "and b.PK.id_C= :idEvent";

        Query queryGetCompany = this.entityManager.createQuery(queryCompany);
        queryGetCompany.setParameter("idEvent",c.getID());

        List companyList = queryGetCompany.getResultList(); 
        //how can I get A.name A.location from this list?

另外,这是我查询的好方法吗?

3 个答案:

答案 0 :(得分:4)

首先:你的结果是什么样的名单“companyList”?从您的查询中获得列表列表,并且必须说

    companyList.get(i).get(0) // for name
    companyList.get(i).get(1) // for location

为了更容易使用,您可能还会在开始时付出更多努力。然后你就可以拥有一个实用的,面向对象的结构。

为此,请使用一种DTO(数据传输对象),其类可能如下所示:

    class CompanyDTO{

      public CompanyDTO(String name, String location){
        this.name = name;
        this.location = location;
      }

      private String name;
      private String location;

      public String getName(){
        return this.name;
      }
      public String getLocation(){
        return this.location;
      }
    }

然后你可以在你的查询中说:

    select new CompanyDTO (s.name, s.location) 
    from B b, A s 
    where b.bPK.id_A = s.id_A and b.PK.id_C= :idEvent

然后你可以说:

    List<CompanyDTO> companyList = queryGetCompany.getResultList();

以后通过

获取所有名称和位置
    for (CompanyDTO company : companyList){
      System.out.print(company.getName() + ", ");
      System.out.println(company.getLocation());
    }

或其他List-operations。您将从List中获取每个DTO,并可以在这些对象上调用get-Methods。

答案 1 :(得分:3)

如果您选择多个值,则会返回一个列表。

请参阅, http://en.wikibooks.org/wiki/Java_Persistence/Querying#Query_Results

如果您想要对象,请使用

select s from B b, A s where b.bPK.id_A=s.id_A and b.PK.id_C= :idEvent

同时加入通常是通过关系完成的,

select s from A s join s.b b where b.PK.id_C= :idEvent

答案 2 :(得分:0)

它对我有用。

IIRC,您可以执行SELECT o1, o2, o3 FROM EntityA o1, EntityB o2, EntityC o3 WHERE ....,结果将是List<Object[3]>,其中数组内容将包含o1,o2,o3值。

public List<Object[]> findXXX(final String param) {
    final TypedQuery<Object[]> query = this.em.createNamedQuery(
            "package.entity.function", Object[].class);
    query.setParameter("variable", variable);

    return query.getResultList();
}