복붙노트

[SQL] 오류 : 하나 개 이상의 수익률 쿼리에 대해 TypedQuery를 만들 수 없습니다

SQL

오류 : 하나 개 이상의 수익률 쿼리에 대해 TypedQuery를 만들 수 없습니다

나는 자바와 JPA와 기능 searchBook을하려고합니다. 나는 미디어와 책이다 2 종류가 있습니다. 예약 미디어를 확장합니다. 그리고 다른 테이블의 데이터를 유지합니다. 나는 아래의 쿼리에서 데이터를 선택하려고 :

TypedQuery<Media> query = em.createQuery(
                "SELECT m.title, b.isbn, b.authors"
                        + " FROM Book b, Media m" + " WHERE b.isbn = :isbn"
                        + " OR lower(m.title) LIKE :title"
                        + " OR b.authors LIKE :authors", Media.class);
        query.setParameter("isbn", book.getisbn());
        query.setParameter("title", "%" + book.getTitle().toLowerCase()
                + "%");
        query.setParameter("authors", "%" + book.getAuthors() + "%");
        bookList = query.getResultList();

하지만 난 오류가 발생했습니다 :

이것은 내가 JPA를 사용하는 것은 이번이 처음이다. 나는 실수를 찾을 수 없습니다.

해결법

  1. ==============================

    1.이 예외가 왜 미디어 및 도서 모델링 방법에 대한 세부 사항으로가는없이, 나는 적어도 설명합니다.

    이 예외가 왜 미디어 및 도서 모델링 방법에 대한 세부 사항으로가는없이, 나는 적어도 설명합니다.

    당신은 일을하는지 :

    em.createQuery(someJPQL, Media.class);
    

    이 수단 : someJPQL를 사용하여 쿼리를 작성하고,이 쿼리는 미디어 개체의 인스턴스를 반환합니다.

    하지만 당신의 JPQL은 다음과 같습니다

    SELECT m.title, b.isbn, b.authors ...
    

    그래서 쿼리 유형의 미디어의 실체를 반환하지 않습니다. 그것은 두 개의 서로 다른 기관에서 세 개의 필드를 반환합니다. 당신의 JPA 엔진이 마술이 3 열에서 미디어의 인스턴스를 만들 수있는 방법이 없습니다. 그것은이처럼 보였다 경우 쿼리는 미디어의 인스턴스를 반환합니다 :

    select m from Media m ...
    
  2. ==============================

    2.해결 방법으로, 다른 엔티티 속성으로 구성 엔티티, 당신은 그것을 위해 생성자를 제공, 질의 내에서 그것을 만들 수 있습니다 얻을 수 있습니다.

    해결 방법으로, 다른 엔티티 속성으로 구성 엔티티, 당신은 그것을 위해 생성자를 제공, 질의 내에서 그것을 만들 수 있습니다 얻을 수 있습니다.

    검색어 :

    TypedQuery<Media> query = em.createQuery("SELECT NEW package_name.Media(m.title, b.isbn, b.authors)"
    + " FROM Book b, Media m" 
    + " WHERE b.isbn = :isbn"                         
    + " OR lower(m.title) LIKE :title"                         
    + " OR b.authors LIKE :authors", Media.class); 
    

    엔티티 :

    public Media(String title, int isbn, String author){
    
        //-- Setting appropriate values
    }
    

    나는 따라 생성자의 데이터 유형을 변경 샘플을 제공하고 있습니다.

  3. ==============================

    3.당신은 여전히 ​​TypedQuery을 사용하고자하는 경우 오브젝트에의 결과 유형을 변경할 수 있습니다 [].

    당신은 여전히 ​​TypedQuery을 사용하고자하는 경우 오브젝트에의 결과 유형을 변경할 수 있습니다 [].

    List<Object[]> results = entityManager
        .createQuery("SELECT m.title, b.isbn, b.authors ...", Object[].class)
        .getResultList();
    

    목록에있는 각 개체 [] 데이터의 행을 나타냅니다. 그것은 그들이 쿼리에서 선택 된 순서대로 해당 행에 대한 선택된 값이 포함되어 있습니다. 0 요소는 소자 (1)는 ISBN 인 표제이며, 소자 (2)은 저자이다. 당신은 의미있는 방식으로 사용하려는 경우 당신은 가능성이 그 값을 캐스팅해야합니다. 필드 값은 두 개의 서로 다른 테이블에서 온 때문에, 당신은 컨테이너 개체의 어떤 종류에 저장할 수 있습니다.

    List<MediaContainer> mediaList = new ArrayList<>();
    
    for (Object[] row : results) {
        MediaContainer container = new MediaContainer();
        container.setTitle((String) row[0]);
        container.setIsbn((int) row[1]);
        container.setAuthors((String) row[2]);
    
        mediaList.add(container);
    }
    
  4. ==============================

    4.당신은 최대 절전 모드 버전 <4를 사용하는 경우, 당신은이 버그를 만날 수 있습니다.

    당신은 최대 절전 모드 버전 <4를 사용하는 경우, 당신은이 버그를 만날 수 있습니다.

    나는 V3.5과 같은 문제를 이동합니다. 마지막으로 나는 간단한 쿼리를 사용했고, 각 파라미터를 수동 캐스트

    여기에 다른 의견을 참조하십시오 https://groups.google.com/forum/#!topic/axonframework/eUd1d4rotMY

  5. ==============================

    5.@WebUser 대신하고

    @WebUser 대신하고

    List<EntityIDKey> companies = 
    getEntityManager().createQuery(sql, EntityIDKey.class).getResultList();
    

    이 시도 :

    List<EntityIDKey> companies =
    (List<EntityIDKey>)getEntityManager().createQuery(sql).getResultList();
    

    나를 위해 작동합니다.

  6. ==============================

    6.I ... 삭제

    I ... 삭제

    이 소스에서 더 많은 엔티티를 반환하기 때문에 "SELECT m.title, b.isbn, b.authors"

    전의.:

    TypedQuery<Media> query = em.createQuery(
    "SELECT m.title, b.isbn, b.authors"
    + " FROM Book b, Media m" + " WHERE b.isbn = :isbn"
    + " OR lower(m.title) LIKE :title"
    + " OR b.authors LIKE :authors");
    
  7. from https://stackoverflow.com/questions/10807496/error-cannot-create-typedquery-for-query-with-more-than-one-return by cc-by-sa and MIT license