2016-04-18 9 views
0

Ich habe 2 Hibernate-Einheiten: und Dog.Ruhezustand: Reihenfolge der Objekte basierend auf dem Alter

Ich möchte eine Methode schreiben, die bestimmt, was der "älteste" Kennel in meiner Datenbank ist.

Dies wäre trivial, wenn die Kennel Entity eine "erstellt" oder ähnliche Spalte hätte, aber es nicht.

In meiner Dog-Entität gibt es jedoch ein born-Feld (DateTime), das dem BORN column zugeordnet ist.

dieses Bild Hund Feld Mit Ich mag würde die älteste Kennel von zu definieren, welche die älteste Hund in ihm hat.

Ein Zwinger kann viele Hunde haben, aber ein Hund kann nur einen Zwinger haben.

Wie kann ich das tun?

Instanzen:

Zwinger:

@Entity 
@Table(name = "KENNEL") 
public class Kennel 
{ 
    @Id 
    private String id; 

    @Column(name = "LOCATION") 
    private String location; 

} 

Hund:

@Entity 
@Table(name = "DOG") 
public class Dog 
{ 
    @Id 
    private String id; 

    @Column(name = "NAME") 
    private String name; 

    @Column(name = "BORN") 
    private DateTime created; 

    @Column(name= "KENNEL_ID) 
    private String kennelId;   

    @ManyToOne(cascade = CascadeType.ALL) 
    @JoinColumn(name = "KENNEL_ID") 
    private Kennel kennel; 

} 

Antwort

1

Versuch, @ Marks Vorschlag zu implementieren.

Erstellen Sie eine benannte Abfrage in Ihrer Dog Klasse, wie unten gezeigt, und rufen Sie sie von Ihrem DAO ab.

@Entity 
@Table(name = "DOG") 
@NamedQueries({ 
    @NamedQuery(name="Dog.findOldestKennel", query="SELECT d.kennel 
     FROM Dog d order by d.created ASC LIMIT 1"), 
    @NamedQuery(name="Dog.getAllKennelsInAgeOrder", query="SELECT d.kennel 
     FROM Dog d order by d.created ASC") 
}) 
public class Dog { 
    @Id 
    private String id; 

    @Column(name = "NAME") 
    private String name; 

    @Column(name = "BORN") 
    private DateTime created; 

    @Column(name= "KENNEL_ID) 
    private String kennelId;   

    @ManyToOne(cascade = CascadeType.ALL) 
    @JoinColumn(name = "KENNEL_ID") 
    private Kennel kennel; 

} 

Ein Beispiel DAO-Methode, Hibernate EntityManager verwendet, wird weiter unten (Projekt Implementierung unterscheiden können) für alle Zwinger in der Reihenfolge bekommen, dass Sie gesagt haben. Hier rufen wir die benannte Abfrage auf, die in der Klasse Dog erstellt wurde, und geben die Ergebnisliste zurück.

public List<Kennel> getAllKennels(){ 
    try{ 
     // name of the desired NamedQuery to run should be given 
     Query queryStr = this.entityManager 
      .createNamedQuery("Dog.getAllKennelsInAgeOrder");    
     List<Kennel> kennels = queryStr.getResultList(); 

     if(null != kennels && !kennels.isEmpty()){ 
      return kennels; 
     } else { 
      return Collections.emptyList(); 
     } 
    } catch (Exception e) { 
     LOGGER.error("Exception Occcured in getAllKennels ", e); 
    } 
} 
+0

Ok danke, aber wie bestelle ich dann den Rest der Zwinger? I.e. vom ältesten zum jüngsten? – java123999

+1

Entfernen Sie einfach die 'LIMIT 1' am Ende der Abfrage. Das würde die ganze Liste der Zwinger zurückgeben, geordnet vom ältesten zum jüngsten. – SarathChandra

+0

Danke, können Sie ein Beispiel für die Verwendung geben? Entschuldigung, ich bin sehr neu in der Verwendung von SQL-Abfragen – java123999

1

Warum, nicht nur den ältesten Hund finden, wie man trivial gesagt ist, und dann erhalten Sie den Kennel mit dog.kennel?

+0

Ich bin mir nicht sicher, was du meinst? Können Sie ein Beispiel veröffentlichen? Thanks – java123999

+0

Ich meine nur eine Abfrage für den ältesten Hund anstelle des ältesten Zwingers durchzuführen. Sobald Sie den ältesten Hund, als Objekt, in Ihrem Java-Code bekommen, greifen Sie einfach den Verweis auf den Zwinger, zu dem das Hund-Objekt gehört. –

+0

Ok, aber wie bestelle ich dann den Rest der Zwinger? I.e. vom ältesten zum jüngsten? – java123999

Verwandte Themen