2017-06-16 12 views
0

が に参加しから最新のレコードをフェッチしようとして立ち往生から日付で最新のレコードを取得著者JPA @OneToMany私は、次のクラス</p> <p>を持って参加

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

ブック

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

リポジトリ

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

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

    } 

現在の結果。このことから

{ 
     "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' 

     }] 
    } 

期待される結果

{ 
     "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' 

    }] 
    } 

著者のリストは、すべて、それぞれの本に戻されます。

質問JPAは、出版された日付に基づいてコレクションから最新の本のみを選ぶのを助けることができますか?

+0

"JPAは公開された日付に基づいてコレクションから最新の本のみを選ぶのを助けますか?" –

+0

現在の結果と期待される結果が追加されました。希望はそれを少し明確にします。おそらく、著者ごとの本のコレクションの最大の日付を行う可能性がある場合 –

+0

基本的に、各ユーザーの書籍のリストから最新の本(単行本)を入手しようとしていますか? –

答えて

1

休止状態を使用している場合は、@JoinFormulaを使用して最新のレコードを日付順にマップします。次のようなものがあります。

@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

このサイトを参照していただきありがとうございますhttps://vladmihalcea.com/2017/02/16/how-to-map-the-latest-child-of-a-parent-entity-using-hibernate-joinformula/ –

+0

Lazyの読み込みのために、「org.hibernate.proxy.pojo.javassist.Javassistのシリアライザが見つかりませんでした」というエラーがありましたが、次の質問を参考にしました:https://stackoverflow.com/questions/24994440/no-serializer-found -for-class-org-hibernate-proxy-pojo-javassist-javassistです。私はその効果が何であるのだろうか? –

0

あなたは各著者のための最後の本を取得したい場合、あなたはそれを得るために、過渡フィールドを追加することができます。

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

または1つに1加えると@PostPersistで注釈を付け、同じ方法でDBに保存し、 @PostUpdate。自動的にdbに保存されます。

関連する問題