【问题标题】:Query in Hibernate with HQL在 Hibernate 中使用 HQL 进行查询
【发布时间】:2016-06-06 22:47:13
【问题描述】:

我一直在尝试使用 HQL 进行简单查询,但它总是返回我

java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: 
unexpected token: on near line 1, column 72 
[select p, g.Description from entity.TB_Person p inner join TB_Gender g 
 on p.IdGender = g.Id where p.Username= :Username]

查询代码如下:

String jpql = "select p, g.Description "
            + "from TB_Person p inner join TB_Gender g "
            + "on p.IdGender = g.Id where p.Username= :Username";
Query query = manager.createQuery(jpql);
query.setParameter("Username", credentials.getUsername());
List l = (List)query.getResultList();

这是我的实体:

package entity;

import java.util.Date;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

import org.hibernate.annotations.ForeignKey;

@Entity
@Table(name="TB_Person")
public class TB_Person {

@Id
private String CPF;

private String Name;

private Date Birthday; 

private String PhotoPath;

@ForeignKey(name = "fk_TB_Person_TB_User1")
private String Username;

@ForeignKey(name = "fk_person_gender")
private int IdGender;
public String getUsername() {
    return Username;
}

public void setUsername(String username) {
    Username = username;
}

public String getCPF() {
    return CPF;
}

public void setCPF(String cPF) {
    CPF = cPF;
}

public String getName() {
    return Name;
}

public void setName(String name) {
    Name = name;
}

public Date getBirthday() {
    return Birthday;
}

public void setBirthday(Date birthday) {
    Birthday = birthday;
}

public String getPhotoPath() {
    return PhotoPath;
}

public void setPhotoPath(String photoPath) {
    PhotoPath = photoPath;
}
}

package entity;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="TB_Gender")
public class TB_Gender {

    @Id
    private int Id;

    private String Description;

    private String Abbreviation;

    public String getDescription() {
        return Description;
    }

    public void setDescription(String description) {
        Description = description;
    }

    public String getAbbreviation() {
        return Abbreviation;
    }

    public void setAbbreviation(String abbreviation) {
        Abbreviation = abbreviation;
    }

    public int getId() {
        return Id;
    }

}

我做错了什么?

【问题讨论】:

    标签: java hibernate jpa hql jpql


    【解决方案1】:

    我认为您没有正确建立实体之间的关系。

    @ForeignKey代表constraint,但不代表java实体之间的关系本身。

    在 Hibernate 5.1 版本之前,如果您之前没有使用 @OneToOne, @OneToMany, @ManyToOne 等注释在它们之间建立关系,则不能在 JPQL 中使用实体之间的连接,... 更多 info 关于此主题以及如何连接无关实体。

    要执行查询,您必须在实体中定义类似的内容

     @Entity
     @Table(name="TB_Person")
     public class TB_Person {
    
         @Id
         private String CPF;
    
         @OneToOne
         @JoinColumn(name = "user_id") // <- table column constrained by fk_TB_Person_TB_User1
         private TB_User user;
    
         ...
     }
    

    【讨论】:

    • 谢谢 RubioRic,我将 @ForeignKey 更改为 @JoinColumn(name = "user_id") 并将对实体的引用设置为不是属性 ID 并解决问题。
    猜你喜欢
    • 1970-01-01
    • 2012-02-08
    • 1970-01-01
    • 2014-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-31
    • 1970-01-01
    相关资源
    最近更新 更多