2014-10-16 1 views
0

내가 JPA를 통해는 EclipseLink를 사용하는 코드베이스에서 다음과 같은 패턴을 발견했다 :EclipseLink 사용과 관련된 좋은 패턴입니까?

TypedQuery query = ... 
... 
if(query.getResultList().size() > 0) { 
    return query.getSingleResult(); 
} else { 
    return null; 
} 

좋은 생각입니다 null을 반환 weither 여부에 대한 질문을 폐기를, 좀 더 사실에 대해 궁금하고, 그 두 비록 쿼리가이 프로젝트에서 예상되는로드가 많은 코드에서 연속적으로 발생하면 쿼리를 캐시를 사용하지 않고 데이터베이스에 대해 두 번 실행할 수 있습니다.

잘못된 건데, 두 번째 호출이 항상 캐시에 도달한다고 가정하거나, 이런 종류의 패턴을 다시 작성하여 NoResultException을 잡을 수 있다고 생각합니까?

+0

왜 쿼리를 한 번 실행 한 다음 목록에서 첫 번째 값을 반환하지 않습니까? 캐시를 사용하면 엔티티를 다시 작성할 수 없지만 쿼리를 두 번 실행하는 것은 불필요하며 쿼리 및 옵션에 따라 데이터베이스로 이동합니다. – Chris

+0

음,이 패턴은 NonUniqueResultException을 던질 수 있지만, 첫 번째 결과를 얻지는 않습니다. 혼자서해야합니다. 나는 나쁜 생각이라고 말하는 것이 아니며, 나는이 두 번 호출을하기보다는 명시 적으로 NoResultException을 잡을 것이라고 말하고있다. – gizmo

답변

1

아니요, 좋지 않습니다. 쿼리를 두 번 이상 불필요하게 실행하여 다른 설정에 따라 쿼리가 구성되지 않았거나 구성되지 않았을 수도 있습니다 .EclipseLink에는 쿼리 캐시가 있지만 기본적으로 활성화되어 있지 않으므로 실제로는 그렇지 않습니다. 그것을 여기에서 사용해야합니다. 쿼리 캐시를 구성하지 않은 경우 엔티티가 첫 번째 쿼리에서 캐시되므로 둘 이상의 엔티티를 메모리로 읽은 다음 해당 엔티티 중 하나를 얻으려면 데이터베이스를 다시 방문하는 것이 좋습니다. 당신은 또한 query.setMaxResults를 호출 할 수 있습니다,이 쿼리는 개체의 높은 수를 반환 할 수있는 경우

List values = query.getResultList(); 
if(values.size() > 0) { 
    return values.get(0); 
} else { 
    return null; 
} 

(1);

일반적인 패턴은 목록을 확인하고 첫 번째 값을 반환 그냥 반환 된 결과를 제한합니다.

관련 문제