【问题标题】:Hibernate Join between 2 tables with foreign key带有外键的2个表之间的休眠连接
【发布时间】:2020-12-22 11:40:39
【问题描述】:

我试图获取一个包含两个表连接结果的列表,但总是出错。 我想要的是包含人员和工作名称的列表

  • 错误

    • 无法调用“org.hibernate.hql.internal.ast.tree.FromElement.setAllPropertyFetch(boolean)”,因为“fromElement”为空
  • 我的桌子

      • int id
      • 文字名称
      • int job_id(表 JOB(id) 的外键)
    • 工作
      • int id
      • 文字名称
  • 实体

    @Entity
    @Table(name = "person")
    public class Person{
    
    @Id
    @Column(name = "id")
    int id;
    @Column(name = "name")
    String name;
    @Column(name = "job_id")
    int jobId;
    
    public int getId() {
        return id;
    }
    
    public void setId(int id) {
        this.id = id;
    }
    
    public int getJobId() {
        return jobId;
    }
    
    public void setJobId(int jobd) {
        this.jobId= jobId;
    }
    public String getName() {
        return name;
    }
    
    public void setName(int name) {
        this.name= name;
    }
    
    
    @Entity
    @Table(name = "job")
    public class Job{
    
    @Id
    @Column(name = "id")
    int id;
    @Column(name = "name")
    String name;
    
    public int getId() {
        return id;
    }
    
    public void setId(int id) {
        this.id = id;
    }
    
    public String getName() {
        return name;
    }
    
    public void setName(int name) {
        this.name= name;
    }
    
        public class PersonDAO {
        @Autowired
        private SessionFactory sessionFactory;
    
        public void setSessionFactory(SessionFactory sf) {
            this.sessionFactory = sf;
        }
    
        public List<Person> getAllPerson() {
            Session session = this.sessionFactory.getCurrentSession();
            List<PersonResponse> list = session.createQuery("from Person p left join p.jobId").list();
        }
    }
    
    - PersonResponse
        - POJO with Person parameteres/variables without annotations and job name.
    

【问题讨论】:

  • 什么是关系类型?多对多,多对多?单机?

标签: java spring hibernate hql


【解决方案1】:

为了能够在 hql 中使用 left join,您应该按以下方式更正您对 Person 的映射:

@Entity
@Table(name = "person")
public class Person
{
   @ManyToOne
   @JoinColumn(name = "job_id")
   Job job;

   // ...
}

然后你就可以像这样编写 hql 查询了:

List<Person> list = session.createQuery("select p from Person p left join p.job").list();

【讨论】:

  • 谢谢。关于保存?我应该如何处理这份工作?因为在保存时我只有 id,而不是所有对象
  • 一般来说,使用单独的 DTO 对象进行客户端-服务器通信是一种很好的做法,并且不要为此目的使用 jpa/hibernate 实体。
  • 您的意思是,一个对象用于保存/更新,另一个用于查询?我认为这没有意义,因为具有相同的变量,除了“mayToOne”关系
  • 在起点,这些对象之间的差异可能很小。但是一段时间后,将两者合二为一会越来越困难。请注意,您不能只保存从请求中获得的内容。在this 文章中查找示例以了解其他潜在问题描述。
  • 我想我找到了解决方案vladmihalcea.com/manytoone-jpa-hibernate
猜你喜欢
  • 2015-12-04
  • 1970-01-01
  • 2017-02-24
  • 2013-01-19
  • 1970-01-01
  • 2014-07-21
  • 2012-07-05
  • 1970-01-01
相关资源
最近更新 更多