2012-04-18 2 views
0

Я видел несколько вопросов по этому поводу, но я не могу получить решение моей проблемы.Hibernate org.hibernate.hql.ast.QuerySyntaxException ошибка

У меня есть следующий PositionHistory объект объявлен ...

@Entity 
@Table(name = "position_history") 
@Cache (usage=CacheConcurrencyStrategy.READ_WRITE) 
@AttributeOverride (name="id", column = @Column(name=PositionHistory.PRIMARY_KEY)) 
public class PositionHistory extends AbstractPersistable { 

    public static final String PRIMARY_KEY = "s_posn_history_id"; 
    public static final String KEY = "positionHistory"; 
    public static final String KEY_DATE = "date"; 
    public static final String KEY_COMMENT = "comment"; 

    // String field length definitions 
    public static final int LENGTH_COMMENTS = 1000; 

    // Instance Variables 
    private Date date; 
    private String comment; 

    @Column(name = "d_date", nullable = false) 
    public Date getDate() { 
    return date; 
    } 

    public void setDate(Date date) { 
    this.date = date; 
    } 

    @Column(name = "t_comment", length = LENGTH_COMMENTS) 
    public String getComment() { 
    return comment; 
    } 

    public void setComment(String comment) { 
    this.comment = comment; 
    } 

    // hashCode() 
    // equals() 
    // toString() 
} 

И в PositionHistoryDaoImp Я пытаюсь удалить некоторые строки ...

public void deletePositionHistory(Long positionId) { 
    getSession().createQuery("delete from position_history a where a.position_id=:id") 
     .setParameter("id", positionId).executeUpdate(); 
} 

Когда я называю deletePositionHistory я получаю следующее ошибка ...

ERROR a.g.q.d.v.s.c.CommandProcessorImpl:75 - org.hibernate.hql.ast.QuerySyntaxException: position_history is not mapped 

Как вы можете видеть, та ble уже отображается в объекте PositionHisotry, а PositionHistoryDaoImp расширяет объект.

Что мне не хватает или что-то не так?

Ваша помощь очень ценится.

спасибо.


Position Entity ...

@Entity 
@Table(name = "position") 
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE) 
@AttributeOverride(name = "id", column = @Column(name = Position.PRIMARY_KEY)) 
public class Position extends AbstractPersistableEffective { 
    ... 
    public static final String PRIMARY_KEY = "s_posn_id"; 
    public static final String KEY_ID = "positionId"; 
    private List<PositionHistory> history = new ArrayList<PositionHistory>(); 

    ... 

    @OneToMany(fetch = FetchType.LAZY) 
    @Cascade({CascadeType.ALL, CascadeType.DELETE_ORPHAN}) 
    @JoinColumn(name = Position.PRIMARY_KEY) 
    @IndexColumn(name = AbstractPersistable.INDEX_COLUMN) 
    public List<PositionHistory> getHistory() { 
     return history; 
    } 

    public void setHistory(List<PositionHistory> history) { 
     this.history = history; 
    } 
} 

ответ

2

Вы используете имя таблицы в запросе, в отличие от имени объекта. Изменить это:

getSession().createQuery("delete from position_history a where a.position_id=:id") 

To:

getSession().createQuery("delete from PositionHistory a where a.id =:id") 
+0

Большое спасибо за этот @Perception. Теперь предложение where терпит неудачу, поскольку 'a.position_id' не найден. «Position_id» является внешним ключом для позиции с повторной связью OneToMany. В позиции PositionHistory нет объявления для 'position_id', поскольку он обрабатывается спящим я полагаю. Как правильно передать идентификатор позиции в предложении where? – neo108

+0

Он должен соответствовать имени свойства в вашей сущности (в отличие от имени столбца в вашем db). Я предполагаю, что это называется «positionId». – Perception

+0

Спасибо. Я отдам его. @Perception: Очень ценю вашу помощь. – neo108

1

Изменить свойство hibernate.query.factory_class в hibernate.cfg.xml файл, как показано ниже .... Я надеюсь, что это поможет вам ..

<property name="hibernate.query.factory_class">org.hibernate.hql.ast.ASTQueryTranslatorFactory</property> 
Смежные вопросы