2009-07-19 3 views
2

Привет каждый один я эти ClasseHQL Проблема

@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 

I означает, что этот тип HQL просто работать для первичного ключа? или у меня есть проблема? Есть ли способ, которым я могу использовать другое поле (кроме Первичного ключа), которое может соединить таблицу?

ответ

3

Hibernate ожидает использовать имя свойства вместо имени столбца базы данных, т.е. branchName InstEd из bname и userName вместо username.

Так что, если вы измените ваши запросы

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 Я новичок в Hibernate и не знаю много вещей Tanx для быстрого ответа – Am1rr3zA

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