2009-07-19 5 views
2

こんにちは私はこのクエリを使用する場合、私はこれらクラッセにHQL問題

@Entity 
@Table(name = "login", uniqueConstraints={@UniqueConstraint(columnNames={"username_fk"})}) 
public class Login implements Serializable { 

    @Id 
    @Column(name = "id") 
    @GeneratedValue 
    private int id; 
    @Column(name = "password", length = 64) 
    private String password; 
    @Column(name = "roles", length = 32) 
    private String roles; 
    @OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
    @OnDelete(action=OnDeleteAction.CASCADE) 
    @Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN) 
    @JoinColumn(name = "username_fk", nullable=false) 
    private Branch branch; 
    //some getter and sette 

@Entity 
@Table(name = "branch", uniqueConstraints = {@UniqueConstraint(columnNames = {"bname", "branch_fk"})}) 
public class Branch implements Serializable { 

    @Id 
    @GeneratedValue 
    private int id; 
    @Column(name = "username", length = 64, nullable=false) 
    private String userName; 
    @Column(name = "bname", length = 64) 
    private String branchName; 
    @Column(name = "officername", length = 64) 
    private String officerName; 
    @Column(name = "studcount") 
    private int studCount; 
    @Column(name = "blevel", columnDefinition="int default 0") 
    private int level; 
    @Column(name = "officeremail", length = 64) 
    private String officerEmail; 
    @Column(name = "confirmed", columnDefinition = "tinyint default 0") 
    private int confirmed; 

    @OneToOne(mappedBy = "branch", fetch = FetchType.LAZY, cascade = CascadeType.ALL) 
    @OnDelete(action=OnDeleteAction.CASCADE) 
    @Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN) 
    private Login login; 

を持っている一人一人:

executeQuery("select l from Login as l inner join l.branch as b where l.branch.bname = ?", username) 

またはこの:

executeQuery("select b.login from Branch b where b.username = ?", username) 

私はこのエラーを取得する必要があり:

org.hibernate.QueryException: could not resolve property: bname of: Data.Entity.Branch 

が、使用このコード:

executeQuery("select b.login from Branch b where b.id = ?", username) 
it's return correct result 

私はHQLのこのタイプはちょうど主キーのために働くこと?または私の地図に問題がありますか? 私は他のフィールド(主キーを除く)フォームjoinableテーブルを使用することができる方法はありますか?

答えて

3

HibernateはbranchNameusernameの代わりにbnameuserNameのinstedつまり、あなたがデータベース列名の代わりにプロパティ名を使用することを期待しています。

あなたは

executeQuery("select l from Login as l inner join l.branch as b " + 
    "where l.branch.branchName = ?", 
    username); 

executeQuery("select b.login from Branch b where b.userName = ?", username); 

にクエリを変更する場合に予想されるように、すべてが動作するはずです。

+0

Tanx Man:P 私は初心者です。休止状態で多くのことを知らない あなたの素早い回答のためのTanx – Am1rr3zA