如何在 Hibernate 中使用加入 Java 程序?
Posted
技术标签:
【中文标题】如何在 Hibernate 中使用加入 Java 程序?【英文标题】:How to use Join in Java program with Hibernate? 【发布时间】:2018-11-20 11:15:18 【问题描述】:我得到了 Query for fetch two tables data combined
我正在尝试在与 Hibernate3 一起使用的 Java 程序中使用它。 当我尝试获取数据时,我遇到了异常。 我的完整代码在Question in Coderanch, 1st reply have complete java, xml files.。
这是我在 java 程序中使用的查询
String selectQuery = "select student.roll_no, student.name, exam_dates.subject, exam_dates.date "
+ "from student student "
+ "JOIN exam_dates exam_dates on exam_dates.roll_no = student.roll_no";
还有一个试用
String selectQuery = "select student.roll_no, student.name, exam_dates.subject, exam_dates.date "
+ "from student student "
+ "INNER JOIN exam_dates exam_dates on exam_dates.roll_no = student.roll_no";
通过使用它,我得到如下异常:-
14:19:07,752 INFO MemoryContextFactory:34 - Creating EJB3Unit initial JNDI context
org.hibernate.QueryException: outer or full join must be followed by path expression [select student.roll_no, student.name, exam_dates.subject, exam_dates.date from student student INNER JOIN exam_dates exam_dates on exam_dates.roll_no = student.roll_no]
at org.hibernate.hql.classic.FromParser.token(FromParser.java:170)
at org.hibernate.hql.classic.ClauseParser.token(ClauseParser.java:86)
at org.hibernate.hql.classic.PreprocessingParser.token(PreprocessingParser.java:108)
at org.hibernate.hql.classic.ParserHelper.parse(ParserHelper.java:28)
at org.hibernate.hql.classic.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:216)
at org.hibernate.hql.classic.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:185)
at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:77)
at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:56)
at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:72)
at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:133)
at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:112)
at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1623)
at test_db.get_table_by_join(test_db.java:99)
at test_db$1.run(test_db.java:40)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
谁能帮帮我?
【问题讨论】:
请注意,给您的exam_dates
表指定exam_dates
别名是没有意义的。
我删除了别名但没有用。
提示:您可以为您的类使用@Entity 并使用注释在该级别上定义该连接。这有助于拒绝很多类似的错误。
我是否应该更改 student.java 或exam_dates.java 或xml 文件中的某些内容以在java 程序中使用'Join' 或'Inner Join'?
我在 student.java 和exam_dates.java 中添加了@Entity、Column 等,但混淆了'Join' 或'Inner join' 的使用方式?
【参考方案1】:
将您的实体类创建为
@Entity
public class Student
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long rollNo;
private String name;
@OneToMany
private ExamDates examDates;
public void setRollNo(Long rollNo)
this.rollNo = rollNo;
public void getRollNo()
return this.rollNo;
public String getName()
return name;
public void setName(String name)
this.name = name;
public String getExamDates()
return this.examDates;
public void setExamDates(ExamDates examDates)
this.examDates = examDates;
其中 ExamDates 是映射到您的考试日期表的另一个类。你什么时候打电话
Student s = entityManager.find(Student.class, rollNo);
它会给你学生对象,然后调用 s.getExamDates 这会给你考试日期
【讨论】:
按照上面的说明,是否需要使用查询从两个表中获取数据?我的查询是'select s.roll_no, s.name, ed.subject, ed.date from student s join Exam_dates ed on ed.roll_no = s.roll_no where (ed.roll_no, ed.date) in (select roll_no, max (date) fromexam_dates where date 以上查询我在mysql的查询浏览器中使用并获得预期结果。现在我正在尝试在 java 程序中获取相同的结果。 @Mandar Khire:在我回答之前,我可以知道你之前是否使用过 hibernate,因为这需要复杂的实体和使用 Criterion 类,所以如果你不知道所有这些,那么我推荐请你把这一切都经历一遍。 我将休眠用于单个表,而不是用于复杂查询。 在这种情况下使用查询本身,但请记住 HQL 与 SQL 不同,您需要使用属性名而不是列名。使用 session.createQuery,您需要为此方法提供 HQL 查询,而不是 SQL 查询。您可以将 session.createSQLQuery 与 SQL 查询一起使用,或者将您的查询编写为 HQL 查询,例如: select cv.field from table1 alias1 JOIN alias1.x alias2,其中 x 是您在第一类中的关联元素。希望这会有所帮助!以上是关于如何在 Hibernate 中使用加入 Java 程序?的主要内容,如果未能解决你的问题,请参考以下文章