2017-04-07 17 views
0

みんな!
私は@OneToOneまたは@OneToManyです。
表はproductionであり、表はprice_listです。
productionのテーブルにはprice_listのテーブルにある価格があります。
しかし、price_listは、1つのプロダクションの履歴価格と現在の価格があります。これは、多くのプロダクションがマップできることを意味しますprice_listレコードです。現在の価格は、フィールドstatusと等しい1の数字です。 私の質問は、すぐに現在の価格を見つける方法です@OneToOneまたは@OneToMany ありがとう!JPA使用方法の決定方法@OneToOneまたは@OneToMany

+0

履歴価格もあるので、 '@ OneToMany'が必要だとします。現在の賞金を得るには、クエリ 'findPirceByStatus(Long productId)'を使う必要があると思っています。 –

答えて

0

  1. を行うには、いくつかの方法は、あなたがstatus = 1でのみprice_listレコードを含むデータベース内のビューを(例えばcurrent_price)、作成することがあります。エンティティでは、別のエンティティとしてマップできます。

  2. 上記と同様

    、あなたのprice_listは素敵なIDを持っている場合は、関係として表示を行うことができるので、あなたが使用して気にしない場合は、別の関係

  3. と同じPriceエンティティにマッピングすることができます休止状態固有の機能それはだけではなく、実体の一般的な動作のいくつかの特定のクエリのために必要とされている場合は、あなたが@Where

  4. を使用することができ、あなたは、単に

    select new ProductCurrentPrice(product, price) 
    from Product product 
    left join product.priceList price 
    where product = ... and price.status = ACTIVE 
    
  5. のようなクエリを有することができます
  6. 製品の価格の数が膨大ではない場合、あなたは、単に全体のリストを取得し、エンティティでフィルタリングを行うことがあります。私は他の方法であると考えて

    class Product { 
        @OneToMany 
        List<Price> prices; 
    
        Optional<Price> getCurrentPrice() { 
         prices.stream().filter(p->p.status==ACTIVE).findFirst(); 
        } 
    } 
    

を。

+0

ありがとうございます。参考になりました。エンティティにマップを表示すると、エンティティを更新できますか? –

+0

あなたが取っている方法(1または2)に応じて。 1の場合は、使用しているDBMSによっても異なります。 Oracleはうまくいくはずです。他のDBMSについてよくわからない –

+0

もう一度ありがとう。私はあなたのsuggesionを取る(3..5)。あなたは香港にいますか?あなたは中国語を話せますか? –

-1

@OneToManyを使用し、ビューまたはストアドプロシージャのクエリで現在の価格を取得するためのステータスを渡します。

+0

ありがとうございます。ステータスをエンティティに渡す方法は?あなたは私にサンプルを与えることができますか? –

+0

これはあなたに不完全なエンティティを与えるでしょう、そして、私はHibernateがそれが不完全であることを知る方法がないと信じています。したがって、最初のレベルのキャッシュからのエンティティの引き続いての検索は常にあなたにその不完全なエンティティを与えます –

+0

@AdrianShumあなたはそれを冬眠すべての価格のリストを提供します。私は(あなたの答えでも同じことを言及しても)クエリを言及しました。 –

関連する問題