首页 > 解决方案 > @OneToMany 关系休眠

问题描述

大家好,我有实体:

孩子:@EDIT 感谢@MithatKonuk

@Entity
@Table(name="child")
public class Child {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="ID")
    private int id;

    @Column(name="FirstName")
    private String firstName;

    @Column(name="SecondName")
    private String secondName;

    @Column(name="PESEL")
    private String PESEL;

    @Column(name="Sex")
    private String sex;

  @JsonBackReference
  @ManyToOne(cascade = CascadeType.ALL)
  @JoinColumn(name="familyid",referencedColumnName = "id")
  private Family family;

和家人:@EDIT 感谢@MithatKonuk

@Entity
@Table(name="family")
public class Family {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID")
    private int id;



    @OneToOne(cascade = CascadeType.ALL)
    private Father father;

    @JsonManagedReference
    @OneToMany(mappedBy = "family",fetch=FetchType.EAGER,cascade = CascadeType.ALL)
    private List<Child> childList;

我想获得属于家庭一部分的孩子名单。我尝试进行查询:@EDIT 感谢@MithatKonuk

@Transactional
public List<Child> findAllChild(int id) {
    // TODO Auto-generated method stub
    HibernateUtil.initManager();
    HibernateUtil.getEntityManager().clear();
    Query query = HibernateUtil.getEntityManager().createQuery("SELECT child FROM Child child FETCH JOIN child.family u WHERE u.id = :userId ");
    query.setParameter("userId",id);
    List<Child> result = query.getResultList();
    HibernateUtil.shutdown();
    return result;
}

当我尝试运行它时,我总是得到错误:

Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: expecting "all", found 'JOIN' near line 1, column 64 [SELECT child FROM com.example.Family3.domain.Child child FETCH JOIN child.family u WHERE u.id = :userId ]
    at org.hibernate.hql.internal.ast.QuerySyntaxException.convert(QuerySyntaxException.java:74) ~[hibernate-core-5.3.5.Final.jar:5.3.5.Final]
    at org.hibernate.hql.internal.ast.ErrorTracker.throwQueryException(ErrorTracker.java:93) ~[hibernate-core-5.3.5.Final.jar:5.3.5.Final]
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:296) ~[hibernate-core-5.3.5.Final.jar:5.3.5.Final]
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:188) ~[hibernate-core-5.3.5.Final.jar:5.3.5.Final]
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:143) ~[hibernate-core-5.3.5.Final.jar:5.3.5.Final]
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:119) ~[hibernate-core-5.3.5.Final.jar:5.3.5.Final]
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:80) ~[hibernate-core-5.3.5.Final.jar:5.3.5.Final]
    at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:153) ~[hibernate-core-5.3.5.Final.jar:5.3.5.Final]
    at org.hibernate.internal.AbstractSharedSessionContract.getQueryPlan(AbstractSharedSessionContract.java:595) ~[hibernate-core-5.3.5.Final.jar:5.3.5.Final]
    at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:704) ~[hibernate-core-5.3.5.Final.jar:5.3.5.Final]
    ... 9 common frames omitted

我需要你的帮助。

@Edit 好的,所以我将此代码更新为完整实体。你还需要一些吗?我很抱歉,也许这很容易,但我学习了休眠,我不知道这个 cos 出了什么问题。感谢您的回答。

标签: javaspringhibernate

解决方案


首先,您需要更改您的查询

@Transactional
public List<Child> findAllChild(int id) {
    // TODO Auto-generated method stub
    HibernateUtil.initManager();
    HibernateUtil.getEntityManager().clear();
    Query query = HibernateUtil.getEntityManager().createQuery("SELECT child FROM Child child JOIN FETCH child.family  WHERE child.family.id = :userId ");
    query.setParameter("userId",id);
    List<Child> result = query.getResultList();
    HibernateUtil.shutdown();
    return result;
}

第二个是请将@Entity 和@Table("child") 和@Table("family") 添加到每个类,如下所示

@Entity
@Table("child table name")
public class Child{}

@Entity
@Table("family table name")
public class Family{}

推荐阅读