Проблема HQL - PullRequest
       7

Проблема HQL

2 голосов
/ 19 июля 2009

Привет всем, у меня есть эти classe

@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 работает только для первичного ключа? или у моего maping есть проблема? есть ли способ, которым я могу использовать другое поле (кроме первичного ключа) формы присоединяемой таблицы?

1 Ответ

3 голосов
/ 19 июля 2009

Hibernate ожидает, что вы будете использовать имя свойства вместо имени столбца базы данных, т.е. branchName вместо 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);

, все должно работать как положено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...