2016-06-09 3 views
1

Ich habe 2 Objekte Seite und Seite. Eine Site hat viele Seiten. Ich bekomme Seiten mit Lazy Typ holen. Aus einem bestimmten Grund möchte ich Seiten einer Website, wo das Datum der Seiten> val.Wie bekomme ich Entity-Objekt mit der Conversion 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; 
    } 
} 

Jetzt in SiteDao habe ich die mothode eine Website aufrufen und ihre Seiten

@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; 
    } 
} 

Dieses gut dreht, aber s.getPages() alle Seiten zurückkehren, und ich möchte nur einige Seiten, wo die Bedingungen mit bekommen. Ich habe viele Optionen wie:

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); 

Im bloked nach vielen Recherchen, hat jede Person eine Vorstellung davon haben, wie kann ich dieses Problem beheben?

BR

+1

Was passiert also? Eine Ausnahme? Falsche Ergebnisse? –

+0

Ich arbeite nicht, es immer noch alle Seiten, wenn ich 's.getPages()' Methode aufrufen. –

Antwort

2

Sie einige Business-Methoden benötigen, können Sie innerhalb der Website Klasse halten können

Es gibt zwei Optionen

1. Filter hinzufügen

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; 
} 

2.Use Abfrage

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(); 
} 

Hoffnung t seine Arbeit.

+0

Vielen Dank für Ihre Answear. Definitiv wird es funktionieren, aber das Ziel meiner Anfrage ist es, die Speicherleistung zu verbessern und die 's.getPages' Methode kann keine Lösung sein, da sie mehr als 500.000 Seiten zurückgibt. Also möchte ich diese Zahl reduzieren, indem ich nur einige Seiten direkt abfrage. –

+0

Verwenden Sie die zweite Option, die nach Ihrer Abfrage zurückgibt – vels4j

+0

Vielen Dank noch einmal, ich habe versucht, die zweite Option, aber kein Ergebnis von der Abfrage erneut. Irgendwelche Vorschläge ? –