예를 들어 다음과 같은 쿼리가 있습니다.
Query q = sess.createQuery("from Cat cat");
List cats = q.list();
이런 식으로 만들려고하면 다음 경고가 표시됩니다.
Type safety: The expression of type List needs unchecked conversion to conform to List<Cat>
List<Cat> cats = q.list();
그것을 피할 수있는 방법이 있습니까?
답변
@SuppressWarnings
제안 된대로 어디에서나 사용 하는 것이 좋은 방법이지만을 호출 할 때마다 약간의 손가락 입력이 필요합니다 q.list()
.
내가 제안하는 다른 두 가지 기술이 있습니다.
캐스트 도우미 작성
모든 @SuppressWarnings
것을 한곳으로 리팩토링하기 만하면 됩니다.
List<Cat> cats = MyHibernateUtils.listAndCast(q);
...
public static <T> List<T> listAndCast(Query q) {
@SuppressWarnings("unchecked")
List list = q.list();
return list;
}
Eclipse에서 피할 수없는 문제에 대한 경고를 생성하지 않도록 방지
Eclipse에서 Window> Preferences> Java> Compiler> Errors / Warnings로 이동하고 Generic type에서 확인란을 선택합니다.
Ignore unavoidable generic type problems due to raw APIs
이것은 피할 수없는 위에서 설명한 것과 같은 유사한 문제에 대해 불필요한 경고를 해제합니다.
몇 가지 의견 :
- 나는
Query
결과 대신에 전달하기로 결정했다.q.list()
왜냐하면이 “속임수”방법은List
일반적으로 어떤 속임수도 아닌 Hibernate로 속이는 데만 사용될 수 있기 때문이다 . - 비슷한 방법을 추가 할 수 있습니다
.iterate()
.
답변
질문을받은 지 오래되었지만 제 답변이 저와 같은 사람에게 도움이 되었으면합니다.
javax.persistence api 문서를 살펴보면 그 이후로 몇 가지 새로운 메소드가 추가되었음을 알 수 Java Persistence 2.0
있습니다. 그들 중 하나 createQuery(String, Class<T>)
는 TypedQuery<T>
. 이제 모든 작업이 형식에 안전하다는 작은 차이를 제외하고 TypedQuery
했던 것처럼 사용할 수 있습니다 Query
.
따라서 다음과 같이 코드를 변경하십시오.
Query q = sess.createQuery("from Cat cat", Cat.class);
List<Cat> cats = q.list();
그리고 당신은 모두 준비되었습니다.
답변
우리는 또한 사용 @SuppressWarnings("unchecked")
하지만, 메서드 전체가 아닌 변수 선언에서만 사용하려고합니다.
public List<Cat> findAll() {
Query q = sess.createQuery("from Cat cat");
@SuppressWarnings("unchecked")
List<Cat> cats = q.list();
return cats;
}
답변
TypedQuery
대신 사용하십시오 Query
. 예를 들어이 대신 :-
Query q = sess.createQuery("from Cat cat", Cat.class);
List<Cat> cats = q.list();
이것을 사용하십시오 :-
TypedQuery<Cat> q1 = sess.createQuery("from Cat cat", Cat.class);
List<Cat> cats = q1.list();
답변
코드에서 호출 메서드에 다음과 같이 주석을 추가합니다.
@SuppressWarnings ( “선택 취소”)
해킹처럼 보이지만 최근에 공동 개발자가 확인한 결과 그것이 우리가 할 수있는 전부라는 것을 알았습니다.
답변
분명히 Hibernate API의 Query.list () 메서드는 “설계 상”유형 안전 하지 않으며 변경할 계획 이 없습니다 .
컴파일러 경고를 피하는 가장 간단한 해결책은 실제로 @SuppressWarnings ( “unchecked”)를 추가하는 것입니다. 이 주석은 메서드 수준에 배치 할 수 있으며 메서드 내부에있는 경우 변수 선언 바로 앞에 배치 할 수 있습니다 .
Query.list ()를 캡슐화하고 List (또는 Collection)를 반환하는 메서드가있는 경우에도 경고가 표시됩니다. 그러나 이것은 @SuppressWarnings ( “rawtypes”)를 사용하여 억제됩니다.
Matt Quail이 제안한 listAndCast (Query) 메서드는 Query.list ()보다 유연성이 떨어집니다. 할 수있는 동안 :
Query q = sess.createQuery("from Cat cat");
ArrayList cats = q.list();
아래 코드를 시도하면 :
Query q = sess.createQuery("from Cat cat");
ArrayList<Cat> cats = MyHibernateUtils.listAndCast(q);
컴파일 오류 : 유형 불일치 : 목록에서 ArrayList로 변환 할 수 없습니다.
답변
감독이나 실수가 아닙니다. 경고는 실제 근본적인 문제를 반영합니다. 자바 컴파일러가 hibernate 클래스가 제대로 작업을 수행 할 것인지 그리고 반환하는 목록에 Cats 만 포함되어 있는지 실제로 확인할 수있는 방법은 없습니다. 여기에 제안하는 것이 좋습니다.