[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.이 예외가 왜 미디어 및 도서 모델링 방법에 대한 세부 사항으로가는없이, 나는 적어도 설명합니다.
이 예외가 왜 미디어 및 도서 모델링 방법에 대한 세부 사항으로가는없이, 나는 적어도 설명합니다.
당신은 일을하는지 :
em.createQuery(someJPQL, Media.class);
이 수단 : someJPQL를 사용하여 쿼리를 작성하고,이 쿼리는 미디어 개체의 인스턴스를 반환합니다.
하지만 당신의 JPQL은 다음과 같습니다
SELECT m.title, b.isbn, b.authors ...
그래서 쿼리 유형의 미디어의 실체를 반환하지 않습니다. 그것은 두 개의 서로 다른 기관에서 세 개의 필드를 반환합니다. 당신의 JPA 엔진이 마술이 3 열에서 미디어의 인스턴스를 만들 수있는 방법이 없습니다. 그것은이처럼 보였다 경우 쿼리는 미디어의 인스턴스를 반환합니다 :
select m from Media m ...
-
==============================
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.당신은 여전히 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를 사용하는 경우, 당신은이 버그를 만날 수 있습니다.
나는 V3.5과 같은 문제를 이동합니다. 마지막으로 나는 간단한 쿼리를 사용했고, 각 파라미터를 수동 캐스트
여기에 다른 의견을 참조하십시오 https://groups.google.com/forum/#!topic/axonframework/eUd1d4rotMY
-
==============================
5.@WebUser 대신하고
@WebUser 대신하고
List<EntityIDKey> companies = getEntityManager().createQuery(sql, EntityIDKey.class).getResultList();
이 시도 :
List<EntityIDKey> companies = (List<EntityIDKey>)getEntityManager().createQuery(sql).getResultList();
나를 위해 작동합니다.
-
==============================
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");
from https://stackoverflow.com/questions/10807496/error-cannot-create-typedquery-for-query-with-more-than-one-return by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] LIKE 만 전체 단어 매치? (0) | 2020.06.08 |
---|---|
[SQL] 비 "독특한"행을 선택하는 방법 (0) | 2020.06.08 |
[SQL] 당신은 어떻게 백업 할 수와 같은 서버에 복사본으로 데이터베이스를 복원? (0) | 2020.06.08 |
[SQL] 테이블 반환 함수 - 출력에 무시로 주문 (0) | 2020.06.07 |
[SQL] SQL 오류 : 골재의 오용 (0) | 2020.06.07 |