2013-04-09 1 views
1

다음과 같은 상황을 가정합니다. Person 및 Comment의 두 엔티티 클래스가 있습니다.기준 API 또는 java.util.List contains() 메소드 사용?

//Person class 
@Entity 
public class Person extends AbstractBusinesObject{ 

@OneToMany(mappedby ="owner") 
private List<Comment> comments; 

//Comment class 
@Entity 
public class Comment extends AbstractBusinesObject{ 

@ManyToOne 
private Person owner; 
내가 특정 코멘트가 특정 사람이나하지에 속하는지 여부를 확인하려면 다음 두 가지 대안에서 (성능, 메모리 효율성) 더 나은하는 방법을 알고 싶습니다

.

public boolean isUsersComment(Person p, Comment c){ 
    CriteriaBuilder cb = getEntitymanager().getCriteriaBuilder(); 
    CriteriaQuery<Comment> cq = cb.createQuery(Comment.class); 
    Root<Comment> root = cq.from(Comment.class); 
    cq.select(root).where(cb.and(cb.equal(root, c), cb.isTrue(root.in(p.getComments()))); 
    try{ 
     getEntityManager().createQuery(cq).getSingleResult(); 
     return true; 
    } catch (NoResultException ex){ 
     return false; 
    } catch (NoUniqueResultException ex){ 
     throw new IllegalStateException(message); 
    } 
} 

public boolean isUsersComment(Person p, Comment c){ 
    return p.getComments().contains(c); 
} 

또는

은 내가 아는 한 기준 API는 데이터베이스 쿼리를 생성하는 컬렉션의 첫 번째 솔루션을 검색하는 동안.

답장을 보내 주셔서 감사합니다.

ps : Criteria API를 처음 사용하므로 수정/제안 사항도 수락합니다.

편집

좋아, 내가 바보 같은 질문이었다 발견했다; 내가 양방향 관계를 선언,이 솔루션은 매우 간단합니다 :

어쨌든
return c.getOwner.equals(p); 

, 단방향 관계의 경우에 방법은 무엇인가?

답변

0

원본 컬렉션이 이미로드되어 있는지 여부에 따라 다릅니다. 콜렉션이로드되면 곧바로 contains() 호출이 수행되고 그렇지 않으면 쿼리 (Criteria 또는 JPQL)가 수행하는 것과 동일합니다.

컬렉션이 큰 경우 전체 컬렉션을로드하고 싶지 않으므로 항상 쿼리를 거쳐야합니다. 그렇지 않으면 Collection.contains를 사용합니다.