2011-01-19 83 views
3

我有一个表我不能用大约该结构JPA2:如何仅将某些表行映射到实体?

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

什么是只与目的=定价一个实体的行映射的首选方式改变?有没有办法做到这一点与JPA批注或我需要一个视图?

回答

4

您可以使用SINGLE_TABLE继承策略,并使用“目的”像这个鉴别列:

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

+1为理念,但不会只有一个工作@ MappedSuperclass父级? – 2011-01-19 15:47:11

+0

它应该只是工作。我从DiscriminatorValue API javadoc中获取了代码示例:http://download.oracle.com/javaee/5/api/javax/persistence/DiscriminatorValue.html – adrianboimvaser 2011-01-19 15:52:03

0

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

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

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

0

如果我正确理解你的问题,你想只能选择行,其中的目的=定价。

有基本的步骤:(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() 

}