2012-04-18 5 views
0

私はこれについていくつかの質問を見ましたが、私は自分の問題を解決することができません。Hibernate org.hibernate.hql.ast.QuerySyntaxExceptionエラー

私はdeletePositionHistoryを呼び出すとき

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

私は次のことを得る... ...

@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に、私はいくつかの行を削除しようとしていると宣言し、次のPositionHistory実体を持っていますエラー...

ご覧のとおり、 bleはすでにPositionHisotryエンティティにマップされており、PositionHistoryDaoImpはエンティティを拡張しています。

私は何が間違っているのか、間違っていますか?

ご協力いただきありがとうございます。

ありがとうございます。


Positionエンティティ...

@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") 

へ:

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

この@Perceptionに感謝します。 'a.position_id'が見つからないので、where節は失敗します。 'position_id'は、OneToManyのreplationshipを持つPositionの外部キーです。私が信じるhibernateによって処理されるので、PositionHistoryエンティティの 'position_id'の宣言はありません。 where句でposition idを正しく渡すにはどうすればよいですか? – neo108

+0

エンティティのプロパティ名と一致する必要があります(dbの列名とは対照的です)。私はそれを 'positionId'と呼んでいます。 – Perception

+0

ありがとうございます。私はそれを行ってあげるよ。 @受信:本当に助けていただきありがとうございます。 – neo108

1

変更hibernate.query.factory_classプロパティを以下のショーとしてhibernate.cfg.xmlファイルに....私は..それはあなたを助けるでしょう願ってい

<property name="hibernate.query.factory_class">org.hibernate.hql.ast.ASTQueryTranslatorFactory</property> 
関連する問題