2016-06-09 3 views
1

나는 2 개체 사이트 및 페이지 있습니다. 사이트에는 많은 페이지가 있습니다. Lazy 유형을 가져 오는 페이지를 얻습니다. 특별한 이유로 나는 페이지의 날짜가> val 인 사이트의 페이지를 얻고 싶다. 어떻게 contion JPA와 엔티티 개체를 얻을 수

@Entity 
@Table(name = "site") 
Public class Site { 
String site_id; 
Set<Page> pages; 
@OneToMany(mappedBy = "site", fetch = FetchType.LAZY, cascade = CascadeType.ALL) 
    public Set<Page> getPages() { 
    return pages; 
    } 
} 

@Entity 
@Table(name = "page") 
Public class Page{ 
String page_id; 
Site site; 
    @ManyToOne(fetch=FetchType.LAZY, cascade = CascadeType.MERGE) 
    @JoinColumn(name = "site_id") 
    public Site getSite() { 
    return site; 
    } 
} 

지금 SiteDao에 내가 사이트와 페이지

이 잘 회전
@Stateless 
public class SiteDao { 
@PersistenceContext(unitName = "name") 
private EntityManager em; 

    public Site getSiteAndPages(String site_id) {   
    Query q = em.createQuery("select s From Site s where s.site_id = :site_id"); 
    q.setParameter("site_id", site_id); 
    Site s = (Site) q.getSingleResult(); 
    s.getPages();   
    return s; 
    } 
} 

를 호출 할 mothode을 가지고 있지만 모든 페이지를 반환 s.getPages()와 나는 어디에 조건을 사용하여 일부 페이지를 싶어. 내가 좋아하는 많은 옵션을 시도 :

Query q = em.createQuery(
      "select s, p From Site s" 
      + " join s.pages p " 
      + " where s.site_id = :site_id " 
      + " and p.site = s" 
      + " and p.lastupdate > :val" 
      ); 
    q.setParameter("site_id", site_id); 
    q.setParameter("val", lastUpdate); 

임 많은 검색 후, 어떤 사람이 내가이 문제를 해결할 수있는 방법에 대한 아이디어가 않습니다 bloked?를

당신은 일부 비즈니스 방법이 필요

+1

그래서 어떻게됩니까? 예외? 잘못된 결과? –

+0

나는's.getPages()'메서드를 호출 할 때 여전히 모든 페이지를 얻는다. –

답변

2

, 당신은 사이트 클래스 내에서 유지할 수 있습니다 BR

이 두 가지 옵션

1. 추가 필터

getLatestPages(Date lastupdate) 
{ 
    List pages_= s.getPages(); 
    List latestPages=new ArrayList(); 
    for(Page p: pages_) 
    { 
    if(p.getLastUpdatedate().after(lastupdate)) { 
      latestPages.add(p); 
    } 
    } 
    reutrn latestPages; 
} 

구석 구석 쿼리

getLatestPages(EntityManager em, Date lastupdate) 
{ 
Query q = em.createQuery(
     "select p From Site s" 
     + " join s.pages p " 
     + " where s.site_id = :site_id " 
     + " and p.site = s" 
     + " and p.lastupdate > :val" 
     ); 
     q.setParameter("site_id", this.site_id); 
     q.setParameter("val", lastUpdate); 
     return q.getResultList(); 
} 

희망 사항 그의 일.

+0

답변 해 주셔서 감사합니다. 확실히 작동하지만 내 요청의 목표는 메모리 성능을 향상시키는 것이고,'s.getPages' 메서드는 50 만 페이지 이상을 반환하기 때문에 해결책이 될 수 없습니다. 그래서 나는 직접적으로 일부 페이지를 검색함으로써이 숫자를 줄이려고합니다. –

+0

쿼리에 따라 반환하는 두 번째 옵션을 사용하십시오. – vels4j

+0

다시 한 번 감사드립니다. 두 번째 옵션을 시도했지만 쿼리에 의해 결과가 변경되지 않았습니다. 어떤 제안? –

관련 문제