Inheritance 命名查询(JPA)中布尔表达式中的编译错误
在我的项目中,我在eclipse Indigo中使用JPA2和Hibernate 我有一个抽象的BaseEntity类,它提供了项目中所有实体所需的一些字段。因此,该类由我在项目中使用的所有其他实体扩展。Inheritance 命名查询(JPA)中布尔表达式中的编译错误,inheritance,entity,jpa-2.0,jpql,named-query,Inheritance,Entity,Jpa 2.0,Jpql,Named Query,在我的项目中,我在eclipse Indigo中使用JPA2和Hibernate 我有一个抽象的BaseEntity类,它提供了项目中所有实体所需的一些字段。因此,该类由我在项目中使用的所有其他实体扩展。 BaseEntity中的一个字段是一个布尔字段deleted,该字段用于将条目标记为已删除(不允许从数据库中物理删除对象)。 现在,当我尝试在子类中设置命名查询并在WHERE子句中使用“NOT u.deleted”时,我从编译器中得到以下错误消息: 无法将状态字段路径“r.deleted”解析
BaseEntity中的一个字段是一个布尔字段
deleted
,该字段用于将条目标记为已删除(不允许从数据库中物理删除对象)。
现在,当我尝试在子类中设置命名查询并在WHERE子句中使用“NOT u.deleted”时,我从编译器中得到以下错误消息:无法将状态字段路径“r.deleted”解析为有效类型。 在BaseEntity的代码下方:
@MappedSuperclass
public abstract class BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
protected Long id;
@Version
protected int version;
@Column(nullable = false, columnDefinition = "boolean default false")
protected boolean deleted;
public boolean isDeleted() {
return deleted;
}
public boolean getDeleted() { // for test-purposes introduced both - isDeleted() & getDeleted()
return deleted;
}
public void setDeleted(boolean deleted) {
this.deleted = deleted;
}
// some other attributes, getters & setters
}
继承类的代码:
@Entity
@Table(name = "User")
@NamedQueries({
@NamedQuery(name = "getAllUsers", query = "SELECT u FROM User u WHERE NOT u.deleted")
})
public class User extends BaseEntity {
// some other fields and getter/setters
}
猜猜怎么回事
编辑:根据下面的注释更新代码。我认为getter和setter很重要。我不确定命名选项,但应该是“
getIsDeleted()
”或“isIsDeleted()
”方法
尝试将布尔值重命名为“已删除”
”
更新:
不要使用“不”
实际上,您将表“用户””映射到类“角色””。因此,您的查询应该如下所示: @NamedQuery(name=“getAllUsers”,query=“从角色中选择rr,其中未删除r”)
结果:返回已删除角色的列表=false正确,getter中会丢失第二个“is”。但是,我将属性名称重命名为
deleted
,将getter/setter重命名为isDeleted()
和setDeleted(boolean deleted)
,但仍然得到了错误。顺便说一句,这两种方法在BaseEntity中都是公共的。我也试过了——也没用。只是为了“好玩”,还尝试在WHERE部分使用getter方法,比如WHERE NOT r.isDeleted()
,但这不起作用。一个愚蠢的问题是:你从用户u中选择了select u,所以它必须是u.deleted,而不是r.deleted。您的查询中有一个简单的输入错误吗?对不起,我从另一个类复制粘贴到上面的注释,其中的查询是相同的,但另一个对象名-但变量u是正确的-只是上面注释中的一个输入错误。我尝试过:where NOT u.isDeleted()
和where NOT u.getDeleted()
和,其中没有u.deleted
-但没有一个有效。抱歉,这是一个输入错误-表用户映射到类用户。然而,这似乎是eclipse中hibernate预处理器中的一个bug,因为我们可以用每个表/类中的每个布尔值重现该行为。。。
SELECT u FROM User u WHERE u.deleted = FALSE