2017-06-16 6 views
0

stecken zu bleiben versuchen, die neuesten Datensatz aus einer Registriert ich zu holen haben die folgenden KlassenJPA @OneToMany neueste Rekord nach dem Datum erhalten von Join

Autor

@Entity 
    @Table(name = "author") 
    public class Author { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private int id; 
    @Column(name = "name") 
    private String name; 
    @OneToMany 
    @JoinColumn(name = "author_id", referencedColumnName = "id") 
    @OrderBy("id Desc") 
    private List<Book> books; 
    public int getId() { 
     return id; 
    } 
    public void setId(int id) { 
     this.id = id; 
    } 
    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
    public List<Book> getBooks() { 
     return books; 
    } 
    public void setBooks(List<Book> books) { 
     this.books = books; 
    } 
    } 

Buch

@Entity 
    @Table(name = "book") 
    public class Book { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private int id; 
    @Column(name = "author_id") 
    private Integer authorId; 
    @Column(name = "date_published") 
    private Date datePublished; 
    public int getId() { 
     return id; 
    } 
    public void setId(int id) { 
     this.id = id; 
    } 
    public Integer getAuthorId() { 
     return authorId; 
    } 
    public void setAuthorId(Integer authorId) { 
     this.authorId = authorId; 
    } 
    public Date getDatePublished() { 
     return datePublished; 
    } 
    public void setDatePublished(Date datePublished) { 
     this.datePublished = datePublished; 
    } 
    } 

Aufbewahrungsort

@Repository 
    public interface AuthorRepository extends 
    JpaRepository<Author, Long> { 

     public Page<Author> findALL(int id, Pageable pageable); 

    } 

Aktuelle Ergebnisse

{ 
     "id": 1, 
     "name": "James", 
     "books":[ 
     { 
     "id": 1, 
     "name": "book1", 
     "datePublished": '12/12/2012' 

     }, 
     { 
     "id": 1, 
     "name": "book2", 
     "datePublished": '01/02/2013' 
     }] 
    }, 

    { 
     "id": 2, 
     "name": "Tim", 
     "books":[ 
     { 
     "id": 5, 
     "name": "book5", 
     "datePublished": '12/12/2014' 

     },{ 
      "id": 6, 
      "name": "book6", 
      "datePublished": '01/02/2015' 

     }] 
    } 

Erwartetes Ergebnis

{ 
     "id": 1, 
     "name": "James", 
     "books":[ 
     { 
     "id": 1, 
     "name": "book2", 
     "datePublished": '01/02/2013' 
     }] 
    }, 
    { 
    "id": 2, 
    "name": "Tim", 
    "books":[ 
    { 
     "id": 6, 
     "name": "book6", 
     "datePublished": '01/02/2015' 

    }] 
    } 

Daraus ergibt sich eine Liste der Autoren werden mit all ihren jeweiligen Bücher zurückgegeben.

Frage ist, wie JPA mir helfen kann, nur das späteste Buch von der Ansammlung auszuwählen, die auf dem veröffentlichten Datum basiert ist.

+0

Können Sie ein wenig mehr auf Ihre Frage "Wie kann JPA mir helfen, nur das neueste Buch aus der Sammlung basierend auf Datum veröffentlicht auswählen."? –

+0

Nur aktuelle und erwartete Ergebnisse hinzugefügt. Hoffe, das macht es ein bisschen klar. Wahrscheinlich, wenn es möglich ist, ein Maximum an der Sammlung von Büchern pro Autor zu machen –

+0

Also, im Grunde, Sie versuchen, das neueste Buch (einzelnes Buch) aus der Liste der Bücher für jeden Benutzer zu bekommen? –

Antwort

1

Wenn Sie Hibernate verwenden, können Sie dies mithilfe @JoinFormula erreichen, um den neuesten Datensatz nach Datum zuzuordnen. Etwas wie:

@ManyToOne(fetch = FetchType.LAZY) 
@JoinFormula("(" + 
    "SELECT b.id " + 
    "FROM book b " + 
    "WHERE b.author_id = id " + 
    "ORDER BY b.date_published DESC " + 
    "LIMIT 1" + 
")") 
private Book latestBook; 
+0

Danke funktioniert für mich mit Bezug auf diese Website https://vladmihalcea.com/2017/02/16/how-to-map-the-latest-child-of-a-parent-entity-using-hibernate-joinformula/ –

+0

Hatte folgenden Fehler "Kein Serializer für die Klasse org.hibernate.proxy.pojo.javassist.Javassist gefunden" aufgrund Lazy Loading, sondern wurde mit der folgenden Frage https://stackoverflow.com/questions/24994440/no-serializer-found unterstützt -für-class-org-hibernate-proxy-pojo-javassist-javassist. Ich frage mich, was sind seine Auswirkungen? –

0

, wenn Sie für jeden Autor letztes Buch erhalten mögen, können Sie transientes Feld hinzufügen, es zu bekommen:

@Entity 
    @Table(name = "author") 
    public class Author { 
    ....... 
    @Transient 
    private Book lastBook; 

    @PostLoad 
    private void setLastBook() { 
    if(books==null || books,isEmpty()) 
    this.lastBook=null; 
    }else{ 
    this.lastBook=books.get(0); 
    } 
} 

oder 00.59 machen und es in db nach demselben Verfahren mit @PostPersist kommentierte speichern und @ PostUpdate. Es speichert in db automatisch letztes Buch