[java] Hibernate HQL 결과로 유형 안전 경고를 피하는 방법은 무엇입니까?

예를 들어 다음과 같은 쿼리가 있습니다.

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 만 포함되어 있는지 실제로 확인할 수있는 방법은 없습니다. 여기에 제안하는 것이 좋습니다.