【问题标题】:JPA2: How to map only certain table rows to an entity?JPA2:如何仅将某些表行映射到实体?
【发布时间】:2011-01-19 14:53:15
【问题描述】:

我有一张表,我无法使用这种结构进行更改

ID, name, purpose, rubbish...
1, foo, PRICING, ...
2, bar, INVENTORY, ...
3, bar, PRICING, ...

仅将具有 purpose=PRICING 的行映射到实体的首选方法是什么?有没有办法使用 JPA 注释来做到这一点,还是我需要一个视图?

【问题讨论】:

    标签: java jakarta-ee jpa-2.0


    【解决方案1】:

    您可以使用 SINGLE_TABLE 继承策略,并使用“目的”作为鉴别器列,如下所示:

    @Entity
    @Table(name="THE_TABLE")
    @Inheritance(strategy=SINGLE_TABLE)
    @DiscriminatorColumn(name="purpose", discriminatorType=STRING)
    @DiscriminatorValue("PRICING")
    public class Pricing{ ... }
    

    【讨论】:

    • +1 表示这个想法,但这不是只适用于 @MappedSuperclass 父级吗?
    • 它应该可以正常工作。我从 DiscriminatorValue API javadoc 中获取了代码示例:download.oracle.com/javaee/5/api/javax/persistence/…
    • 谢谢,这看起来正是我想要的。
    【解决方案2】:

    我不相信纯 JPA 支持这一点。

    如果您使用的是 Hibernate,则可以使用过滤器。可以在here 找到很好的例子。

    这是一个使用供应商特定的扩展非常好的示例,但它们将您锁定在一种实现中。可能其他实现(OpenJPA、EclipseLink...)也支持这一点,但我还没有研究过。

    【讨论】:

      【解决方案3】:

      如果我正确理解了您的问题,您将尝试仅选择目的 = 定价的行。

      有几个基本步骤:(1) 创建实体,(2) 创建查询。 该实体将使用注释并与此类似:

       @Entity 
       public class Foo
        { 
          String name;
          String inventory; 
          ....
        }     
      

      然后你只需构造并执行一个查询:

      .....
          @PersistenceContext
      EntityManager entityManager;
      
       .....
       public List<Foo> getAllWithPricing()
       {
           return entityManager.createQuery("select o from Foo o where o.purpose='PRICING'", Foo.class).getResultList()
      
       } 
      

      【讨论】:

      • 我知道如何选择某些实体,但在这种情况下,我想完全避免创建任何“非定价”实体。如果有人不小心创建了其中一个,他们可能会在系统中造成严重破坏。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-30
      • 2016-07-11
      • 2011-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多