В моем проекте я использую JPA2 и Hibernate внутри eclipse Indigo.
У меня есть абстрактный класс BaseEntity, который предоставляет некоторые поля, необходимые для всех объектов в моем проекте. Поэтому этот класс расширяется всеми другими объектами, которые я использую в своем проекте.
Одним из полей в BaseEntity является логическое поле deleted
, которое необходимо для отметки записи как удаленной (физически не удалять объект из базы данных). Теперь, когда я пытаюсь настроить именованный запрос в подклассе и использовать «NOT u.deleted» в предложении WHERE, я получаю следующее сообщение об ошибке от компилятора:
Путь поля состояния 'r.deleted 'не может быть разрешен к допустимому типу.Ошибка компиляции в булевом выражении в именованном запросе (JPA)
Ниже кода 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
}
Любые предположения, что может быть не так?
EDIT: обновленный код в соответствии с нижеприведенными комментариями.
Правильно, второй «есть» пропустил бы в геттере. Однако я переименовал имя атрибута в 'deleted' и переименовал getter/setter в' isDeleted() 'и' setDeleted (boolean deleted) '- но все еще получал ошибку. Кстати, оба метода общедоступны в BaseEntity. – Stefan
Добавить метод 'getDeleted()' –
Я уже пробовал это тоже - тоже не работал. И просто для «удовольствия» также попытался использовать метод getter в WHERE-Part, например 'WHERE NOT r.isDeleted()', но это не сработало. – Stefan