2017-04-07 96 views
0

伙计!
我有一个@OneToOne@OneToMany的问题。
有一张表production有一张表price_list
一个生产在production表中有一个在price_list表中的价格。
price_list有一个生产的历史价格和当前价格,这意味着生产可以映射许多price_list记录。目前的价格是由字段status标记,其中等于1. 我的问题是如何通过使用@OneToOne@OneToMany 快速找到当前价格谢谢!JPA如何确定使用@OneToOne或@OneToMany

+0

假设您需要'@ OneToMany',因为还有历史价格。认为你需要使用查询'findPirceByStatus(Long productId)'来获得当前奖金。 –

回答

0

有几种方法可以做到

  1. 您可以创建在你的数据库,其中只包含price_list记录与status = 1视图(如current_price)。在你的实体中,你可以将它映射为单独的实体。

  2. 上面类似,如果你的price_list有一个很好的ID,你可以使视图的关系,这样你就可以映射到相同的Price实体作为一个独立的关系

  3. 如果你不介意使用Hibernate的特定功能,您可以使用@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

再次感谢。我会采纳你的建议(3..5)。你在香港吗?你会说中文吗? –

-1

使用@OneToMany并传递状态以获取查询或存储过程中的当前价格。

+0

Thanks.How如何将状态传递给实体?你能给我一个样品吗? –

+0

这会给你一个不完整的实体,我相信Hibernate不会知道它是不完整的,因此随后从第一级缓存中检索实体将永远给你那个不完整的实体 –

+0

@AdrianShum你是对的,将列出所有价格。我提到了查询(即使在你的回答中你也提到了同样的事情)。 –