2010-01-15 85 views
4

我有一个从两个jpa实体(继承)生成的单个表。所以我们在数据库表中生成一个DTYPE列,其实体名称具有值。针对DTYPE的JPA查询

如何写一个jpa查询来获取任何给定实体的数据。即DTYPE ='A'?

我刚刚尝试在jpa查询中使用DTYPE,但如预期的那样,出现“无法解析属性”错误。请让我知道如何编写这个查询。

注 - 我不想使用本机查询。

更新:

我有A类和AA子延伸A. DTYPE有两个值A和AA。

当我查询A时,我得到所有A加AA实体。当我查询A时如何排除AA?

+0

我得到了解决方案:) 我用“选择*从A其中a.id不在(选择aa.id从AA aa)”内转换为sql查询选择....不在(选择ID从表t t其中t.DYPE ='AA') – 2010-01-15 12:21:04

回答

2

假设你有三个实体:

  • 党(超)
  • 人(延伸党)
  • 组织(延伸党)

其中最后两个是两个实体您使用鉴别器列存储,您的JPA-QL查询应该如此简单:

select p from Person p 

得到所有的人。 JPA足够聪明地弄明白了。同样,你可以这样做:

select p from Party p 

并得到他们所有人。

+0

Cletus,当你查询党如何排除人? – 2010-01-15 11:45:12

+2

@ tom_987:您不查询派对,您查询个人或组织。 Party只是继承类型的基类/通用类型。 – 2011-10-05 17:21:05

2

您可以在您的JPA查询中使用实体名称,将鉴别器列抽象出来。

假设你有两个实体类SubClassASubClassB,这无论是从SuperClass继承,那么你可以为这些entites的,像这样的查询:

FROM SubClassA WHERE [...] 

FROM SubClassB WHERE [...] 

如果您想查询对于两个实体,请使用

FROM SuperClass WHERE [...] 
+0

Henning能否请您阅读我的更新并回复我的问题 – 2010-01-15 11:55:57

3

只需在父类中添加一个简单字段dtype即可。 (可插入= false,可更新= false) private String dtype;

所以,你可以用它在你的JPQL查询

1

另外的什么@SCH职位中,如没有直接为我工作,使用的是Oracle,我得到一个异常说“D型“是一种保留的关键字。然后我做了

@DiscriminatorColumn(name = "myDType") 
class abstract AbstractClass{ 

@Column(insertable = false, updatable = false) 
private String myDType; 
[...] 

这工作对我很好,因为这样我可以动态改变我想用一个where条件而不是改变FROM语句来查询类型。