java - @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 出了什么问题。感谢您的回答。
解决方案
首先,您需要更改您的查询
@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{}
推荐阅读
- angular - 如何在输入焦点上动态控制Angular 2+中的父元素类?
- php - 你能给我澄清一下吗
- javascript - 如何使我的轮播居中?
- html - 如何使 div 具有父级的 100% 高度,而与子级的大小无关?复杂的布局
- javascript - sharepoint 中的多个唯一列
- angular - Angular 2 Release 6 如何添加 esri ArcGIS API for JavaScript 3.24
- python - Django连接光标不显示任何表?
- node.js - 获取去重的 npm 树
- sql - oracle sql语句解析字符串
- c# - 如何在 Visual Studio 中启动 ac# 空项目。