我有一个从两个jpa实体(继承)生成的单个表。所以我们在数据库表中生成一个DTYPE列,其实体名称具有值。针对DTYPE的JPA查询
如何写一个jpa查询来获取任何给定实体的数据。即DTYPE ='A'?
我刚刚尝试在jpa查询中使用DTYPE,但如预期的那样,出现“无法解析属性”错误。请让我知道如何编写这个查询。
注 - 我不想使用本机查询。
更新:
我有A类和AA子延伸A. DTYPE有两个值A和AA。
当我查询A时,我得到所有A加AA实体。当我查询A时如何排除AA?
我有一个从两个jpa实体(继承)生成的单个表。所以我们在数据库表中生成一个DTYPE列,其实体名称具有值。针对DTYPE的JPA查询
如何写一个jpa查询来获取任何给定实体的数据。即DTYPE ='A'?
我刚刚尝试在jpa查询中使用DTYPE,但如预期的那样,出现“无法解析属性”错误。请让我知道如何编写这个查询。
注 - 我不想使用本机查询。
更新:
我有A类和AA子延伸A. DTYPE有两个值A和AA。
当我查询A时,我得到所有A加AA实体。当我查询A时如何排除AA?
假设你有三个实体:
其中最后两个是两个实体您使用鉴别器列存储,您的JPA-QL查询应该如此简单:
select p from Person p
得到所有的人。 JPA足够聪明地弄明白了。同样,你可以这样做:
select p from Party p
并得到他们所有人。
Cletus,当你查询党如何排除人? – 2010-01-15 11:45:12
@ tom_987:您不查询派对,您查询个人或组织。 Party只是继承类型的基类/通用类型。 – 2011-10-05 17:21:05
您可以在您的JPA查询中使用实体名称,将鉴别器列抽象出来。
假设你有两个实体类SubClassA
和SubClassB
,这无论是从SuperClass
继承,那么你可以为这些entites的,像这样的查询:
FROM SubClassA WHERE [...]
或
FROM SubClassB WHERE [...]
如果您想查询对于两个实体,请使用
FROM SuperClass WHERE [...]
Henning能否请您阅读我的更新并回复我的问题 – 2010-01-15 11:55:57
只需在父类中添加一个简单字段dtype即可。 (可插入= false,可更新= false) private String dtype;
所以,你可以用它在你的JPQL查询
另外的什么@SCH职位中,如没有直接为我工作,使用的是Oracle,我得到一个异常说“D型“是一种保留的关键字。然后我做了
@DiscriminatorColumn(name = "myDType")
class abstract AbstractClass{
@Column(insertable = false, updatable = false)
private String myDType;
[...]
这工作对我很好,因为这样我可以动态改变我想用一个where条件而不是改变FROM语句来查询类型。
我得到了解决方案:) 我用“选择*从A其中a.id不在(选择aa.id从AA aa)”内转换为sql查询选择....不在(选择ID从表t t其中t.DYPE ='AA') – 2010-01-15 12:21:04