JPA запрос множественного выбора - PullRequest
4 голосов
/ 27 июля 2011

У меня есть такой запрос, как я могу получить тип моей сущности из списка?Он возвращается как объект, но когда я преобразую его в мою сущность, он не разыгрывает.

мои таблицы: 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 ]

4 голосов
/ 19 сентября 2012

Во-первых: какой список представляет ваш результат "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-операции. Вы получите каждое DTO из Списка и сможете вызывать get-Methods для этих объектов.

3 голосов
/ 27 июля 2011

Если вы выберите несколько значений, вы получите список обратно.

См, 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
0 голосов
/ 02 марта 2015

Это работает для меня.

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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...