Java 如何使用联接定义JPA存储库查询

Java 如何使用联接定义JPA存储库查询,java,jpa,orm,repository,jpql,Java,Jpa,Orm,Repository,Jpql,我想使用带有注释@query的Jpa存储库进行连接查询 我有两张桌子: table user with iduser,user_name 以及: 本机查询是: SELECT u.user_name FROM user as u INNER JOIN area as a ON a.iduser = u.iduser WHERE a.idarea = 4 现在我有了一个表Hibernate实体 用户和区域 所以我尝试了UserRespository @Query

我想使用带有注释@query的Jpa存储库进行连接查询

我有两张桌子:

 table user 
 with iduser,user_name 
以及:

本机查询是:

 SELECT
 u.user_name 
 FROM
  user as u 
  INNER JOIN area as a ON a.iduser = u.iduser
  WHERE
  a.idarea = 4
现在我有了一个表Hibernate实体 用户和区域

所以我尝试了UserRespository

@Query(SELECT  u.userName FROM  User u 
  INNER JOIN Area a ON a.idUser = u.idUser
  WHERE
  a.idArea = :idArea)
List<User> findByIdarea(@Param("idArea") Long idArea);

您遇到此问题有两个原因

  • JPQL查询无效
  • 您尚未在实体之间创建基础JPQL查询可以利用的关联
在JPQL中执行连接时,必须确保尝试连接的实体之间存在基础关联。在您的示例中,用户和区域实体之间缺少关联。为了创建这个关联,我们必须在用户类中添加一个区域字段,并建立适当的JPA映射。我已经附上了下面用户的来源。(请注意,我已将映射移动到字段)

User.java

@Entity
@Table(name="user")
public class User {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="iduser")
    private Long idUser;

    @Column(name="user_name")
    private String userName;

    @OneToOne()
    @JoinColumn(name="idarea")
    private Area area;

    public Long getIdUser() {
        return idUser;
    }

    public void setIdUser(Long idUser) {
        this.idUser = idUser;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public Area getArea() {
        return area;
    }

    public void setArea(Area area) {
        this.area = area;
    }
}
@Entity
@Table(name = "area")
public class Area {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="idarea")
    private Long idArea;

    @Column(name="area_name")
    private String areaName;

    @OneToOne(fetch=FetchType.LAZY, mappedBy="area")
    private User user;

    public Long getIdArea() {
        return idArea;
    }

    public void setIdArea(Long idArea) {
        this.idArea = idArea;
    }

    public String getAreaName() {
        return areaName;
    }

    public void setAreaName(String areaName) {
        this.areaName = areaName;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
}
一旦建立了这种关系,您就可以在@Query声明中引用area对象。@query注释中指定的查询必须遵循正确的语法,这意味着您应该省略on子句。见下文:

@Query("select u.userName from User u inner join u.area ar where ar.idArea = :idArea")
在查看您的问题时,我还将用户和区域实体之间的关系设置为双向。这里是区域实体建立双向关系的来源

Area.java

@Entity
@Table(name="user")
public class User {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="iduser")
    private Long idUser;

    @Column(name="user_name")
    private String userName;

    @OneToOne()
    @JoinColumn(name="idarea")
    private Area area;

    public Long getIdUser() {
        return idUser;
    }

    public void setIdUser(Long idUser) {
        this.idUser = idUser;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public Area getArea() {
        return area;
    }

    public void setArea(Area area) {
        this.area = area;
    }
}
@Entity
@Table(name = "area")
public class Area {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="idarea")
    private Long idArea;

    @Column(name="area_name")
    private String areaName;

    @OneToOne(fetch=FetchType.LAZY, mappedBy="area")
    private User user;

    public Long getIdArea() {
        return idArea;
    }

    public void setIdArea(Long idArea) {
        this.idArea = idArea;
    }

    public String getAreaName() {
        return areaName;
    }

    public void setAreaName(String areaName) {
        this.areaName = areaName;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
}

发布你的实体,你需要确保你拥有它们associated@Shinigami这解决了您的问题吗?好的,现在我进行了关联,没有错误,Tnx,但现在查询是?…看起来好像找不到表。。。可能我必须声明a(area)表?原因是:org.hibernate.hql.ast.HqlSqlWalker.createFromJoinElement(HqlSqlWalker.java:396)上的java.lang.NullPointerException