2009-10-16 8 views
16

누군가 JPA 1.0 EntityManager에서 find를 통해 Object를 검색 할 때 찾을 수없는 경우 null을 처리해야하지만 createQuery를 통해 Query 인터페이스를 사용할 때 찾을 수없는 경우 NoResultException을 throw합니다.JPA EntityManager 쿼리에서 NoResultException을 throw하지만 찾을 수없는 이유는 무엇입니까?

아마도 누락되었지만 언어에 대해 매우 모순 된 느낌이 들었습니다. 실제로 쿼리 인터페이스를 사용하여 간단한 찾기에서 더 세분화 된 쿼리로 변경했기 때문에 실제로 많은 재 설계 작업을 수행해야했습니다.

감사합니다.

+0

내가 잘못 생각한 것 같습니다. queryForObject()는 예외를 throw합니다. queryForList()는 빈 목록을 리턴합니다. – cletus

+0

당신은 뭔가를 놓치고 있습니다. 나는 javax.persistence.EntityManager와 javax.persistence.Query에 대해 이야기하고있다. 이해할 수있는 인터페이스를 확인하십시오. –

답변

7

찾기를 수행하면 jpa는 기본 키를 사용하여 2 차 레벨 캐시를 사용하여 엔티티 개체를 찾으며 일반적으로 createQuery 및 getSingleResult보다 훨씬 빠릅니다.

null 또는 개체를 다시 찾을 수 있습니다. 당신이 createQuery를 수행하고 Query 객체의 인스턴스가 생성 될 때. getResultList를 실행하면 (자), getSingleResult를 실행 해 그 예외를 Throw하는 경우에만, NoResultException는 throw되지 않습니다. getResultList를 실행 해, none가 발견되었을 경우는, null가 리턴됩니다.

+4

그게 맞습니다. 왜 JPA 스펙의 사람들이 어떤 경우에는 noresultexception을 던지기로 결정하고 다른 하나는 JPA 스펙이 논리적으로 매우 비슷한 경우 null을 반환하는 이유는 아직 분명하지 않습니다. 확인되지 않은 예외이므로 쉽게 만들 수 없습니다 ... 또는 돌아서 : getSingleResult에서 null을 반환하고 Exception을 throw하는 것에 대해 무엇이 이야기 했습니까? 필자의 견해로는 더 일관성이있다 : getSingleResult에 NoREsultExcpetion을 던지고 null을 찾거나 리턴한다. 그러나 그것을 섞어서는 안된다. –

+0

getResultList()는 적어도 JPA2 참조 구현 인 Eclipselink를 사용하면 NULL이 아닌 빈 List를 반환합니다. – NBW

+1

JPA2는 가능하지만 당시의 질문은 JPA2가 아니지만 JPA –

-1

:

이 문서를 참조하십시오 RuntimeException을 (NoResultException)를 도입함으로써

Object o = q.getSingleResult(); 
if (o != null) 
    return (MyObj) o; 
return o; 

을, 프로그래머 안전하게하여 MyObj에 q.getSingleResult()를 주조하고, 남길 수 있습니다 호출자에 대한 예외.

q.getResultList()와 마찬가지로 항상 목록을 반환하며 null-check는 필요하지 않습니다.

하지만 여전히 비 직관적이라고 느낍니다.

+2

-1 캐스팅 전에 'null'을 확인할 필요가 없으므로 이것은 return (MyObj) q.getSingleResult()' –

+0

디디에 말이 맞습니다. null을 모든 유형에 캐스트 할 수 있습니다. – Spina

+0

미안하지만, 내 나쁜 :( – smallufo

21

쿼리를 사용하면 단일 행의 단일 열 값을 비롯한 거의 모든 항목을 검색 할 수 있습니다.

getSingleResult()이 null을 반환하면 쿼리가 행과 일치하지 않거나 쿼리가 행과 일치하지만 선택한 열에 null 값이 포함되어 있는지 여부를 알 수 없습니다.

관련 문제