java - 在 Hibernate 中使用 HQL 进行查询

标签 java hibernate jpa hql jpql

我已经尝试了很长一段时间用 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;
    }

}

我做错了什么?

最佳答案

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

@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;

     ...
 }

关于java - 在 Hibernate 中使用 HQL 进行查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37667974/

相关文章:

java - JPA 单元测试 - 查询返回比以往任何时候都多的实体

java - JPA @OrderBy 注解 - 排序字符串

java - System.out.println 输出到 JTextArea

java - @IdClass 使用 JPA 和 Hibernate 生成 'Identifier of an Instance was Altered'

java - 使用 SQL 查询的基本 Hibernate 问题

java - Hibernate:直接在bean中设置Id和调用load()或get()方法的区别?

java - Mockito 使用通用集合参数验证方法调用

java - 下载大文件太慢

java - 禁用 libgdx 中的 actor

hibernate - JPA/JPQL : AS identifier disallowed in SELECT clause