2012-05-15 2 views
0

В моем проекте я использую 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: обновленный код в соответствии с нижеприведенными комментариями.

ответ

0

Я думаю, что геттеры и сеттеры важны. Я не уверен в том, что касается именования, но the shoul будет «getIsDeleted()» или «isIsDeleted()».

Попытка переименовать булевый "deleted"

обновление: Не использовать НЕ

SELECT u FROM User u WHERE u.deleted = FALSE 

Существует Tutorial about JPA

+0

Правильно, второй «есть» пропустил бы в геттере. Однако я переименовал имя атрибута в 'deleted' и переименовал getter/setter в' isDeleted() 'и' setDeleted (boolean deleted) '- но все еще получал ошибку. Кстати, оба метода общедоступны в BaseEntity. – Stefan

+0

Добавить метод 'getDeleted()' –

+0

Я уже пробовал это тоже - тоже не работал. И просто для «удовольствия» также попытался использовать метод getter в WHERE-Part, например 'WHERE NOT r.isDeleted()', но это не сработало. – Stefan

0

На самом деле вы сопоставляются таблицу " Пользователь "с классом" Роль ". Таким образом, ваш запрос должен быть как:

@NamedQuery (имя = "getAllUsers", запрос = "SELECT FROM г роли г ГДЕ НЕ r.deleted")

Результат: Возвращение Список роли вычеркнув = false

+0

извините, это была опечатка - Таблица Пользователь сопоставляется с классом User. однако, похоже, это ошибка в препроцессоре hibernate в eclipse, поскольку мы могли бы воспроизвести поведение с каждым логическим значением в каждой таблице/классе ... – Stefan

Смежные вопросы