2017-01-09 98 views
0

我有這2個領域類: Staff.java內處於休眠加入由兩類

package it.jack.fdd.domain; 
 
// Generated 9-dic-2016 17.38.23 by Hibernate Tools 4.3.1.Final 
 

 
import java.util.Date; 
 
import java.util.HashSet; 
 
import java.util.Set; 
 
import javax.persistence.Column; 
 
import javax.persistence.Entity; 
 
import javax.persistence.FetchType; 
 
import javax.persistence.GeneratedValue; 
 
import static javax.persistence.GenerationType.IDENTITY; 
 
import javax.persistence.Id; 
 
import javax.persistence.JoinColumn; 
 
import javax.persistence.ManyToOne; 
 
import javax.persistence.OneToMany; 
 
import javax.persistence.OneToOne; 
 
import javax.persistence.Table; 
 
import javax.persistence.Temporal; 
 
import javax.persistence.TemporalType; 
 

 
import org.codehaus.jackson.annotate.JsonIgnore; 
 

 
/** 
 
* Staff generated by hbm2java 
 
*/ 
 
@Entity 
 
@Table(name = "staff", catalog = "fdd_dbproducts") 
 
public class Staff implements java.io.Serializable { 
 

 
\t private Integer idstaff; 
 
\t private StaffType staffType; 
 
\t private String name; 
 
\t private String surname; 
 
\t private Date birthDate; 
 
\t private String phone; 
 
\t private boolean gender; 
 
\t private Boolean working; 
 
\t private StaffLogin staffLogin; 
 
\t private Set<RtStaffDispenser> rtStaffDispensers = new HashSet<RtStaffDispenser>(0); 
 

 
\t public Staff() { 
 
\t } 
 

 
\t public Staff(StaffType staffType, String name, String surname, Date birthDate, String phone, boolean gender) { 
 
\t \t this.staffType = staffType; 
 
\t \t this.name = name; 
 
\t \t this.surname = surname; 
 
\t \t this.birthDate = birthDate; 
 
\t \t this.phone = phone; 
 
\t \t this.gender = gender; 
 
\t } 
 

 
\t public Staff(StaffType staffType, String name, String surname, Date birthDate, String phone, boolean gender, 
 
\t \t \t Boolean working, StaffLogin staffLogin, Set<RtStaffDispenser> rtStaffDispensers) { 
 
\t \t this.staffType = staffType; 
 
\t \t this.name = name; 
 
\t \t this.surname = surname; 
 
\t \t this.birthDate = birthDate; 
 
\t \t this.phone = phone; 
 
\t \t this.gender = gender; 
 
\t \t this.working = working; 
 
\t \t this.staffLogin = staffLogin; 
 
\t \t this.rtStaffDispensers = rtStaffDispensers; 
 
\t } 
 

 
\t @Id 
 
\t @GeneratedValue(strategy = IDENTITY) 
 

 
\t @Column(name = "idstaff", unique = true, nullable = false) 
 
\t public Integer getIdstaff() { 
 
\t \t return this.idstaff; 
 
\t } 
 

 
\t public void setIdstaff(Integer idstaff) { 
 
\t \t this.idstaff = idstaff; 
 
\t } 
 

 
\t @ManyToOne(fetch = FetchType.EAGER) 
 
\t //metto EAGER al posto di LAZY altrimenti mi da errore 500 e per quanto riguarda la chiave esterna. 
 
\t @JoinColumn(name = "fkstaff_type_staff", nullable = false) 
 
\t public StaffType getStaffType() { 
 
\t \t return this.staffType; 
 
\t } 
 

 
\t public void setStaffType(StaffType staffType) { 
 
\t \t this.staffType = staffType; 
 
\t } 
 

 
\t @Column(name = "name", nullable = false, length = 45) 
 
\t public String getName() { 
 
\t \t return this.name; 
 
\t } 
 

 
\t public void setName(String name) { 
 
\t \t this.name = name; 
 
\t } 
 

 
\t @Column(name = "surname", nullable = false, length = 45) 
 
\t public String getSurname() { 
 
\t \t return this.surname; 
 
\t } 
 

 
\t public void setSurname(String surname) { 
 
\t \t this.surname = surname; 
 
\t } 
 

 
\t @Temporal(TemporalType.DATE) 
 
\t @Column(name = "birth_date", nullable = false, length = 0) 
 
\t public Date getBirthDate() { 
 
\t \t return this.birthDate; 
 
\t } 
 

 
\t public void setBirthDate(Date birthDate) { 
 
\t \t this.birthDate = birthDate; 
 
\t } 
 

 
\t @Column(name = "phone", nullable = false, length = 45) 
 
\t public String getPhone() { 
 
\t \t return this.phone; 
 
\t } 
 

 
\t public void setPhone(String phone) { 
 
\t \t this.phone = phone; 
 
\t } 
 

 
\t @Column(name = "gender", nullable = false) 
 
\t public boolean isGender() { 
 
\t \t return this.gender; 
 
\t } 
 

 
\t public void setGender(boolean gender) { 
 
\t \t this.gender = gender; 
 
\t } 
 

 
\t @Column(name = "working") 
 
\t public Boolean getWorking() { 
 
\t \t return this.working; 
 
\t } 
 

 
\t public void setWorking(Boolean working) { 
 
\t \t this.working = working; 
 
\t } 
 

 
\t @OneToOne(fetch = FetchType.EAGER, mappedBy = "staff") 
 
\t public StaffLogin getStaffLogin() { 
 
\t \t return this.staffLogin; 
 
\t } 
 

 
\t public void setStaffLogin(StaffLogin staffLogin) { 
 
\t \t this.staffLogin = staffLogin; 
 
\t } 
 

 
\t @OneToMany(fetch = FetchType.EAGER, mappedBy = "staff") 
 
\t @JsonIgnore 
 
\t public Set<RtStaffDispenser> getRtStaffDispensers() { 
 
\t \t return this.rtStaffDispensers; 
 
\t } 
 

 
\t public void setRtStaffDispensers(Set<RtStaffDispenser> rtStaffDispensers) { 
 
\t \t this.rtStaffDispensers = rtStaffDispensers; 
 
\t } 
 

 
}

RtStaffDispenser.java

package it.jack.fdd.domain; 
 
// Generated 30-nov-2016 0.17.09 by Hibernate Tools 4.3.1.Final 
 

 
import javax.persistence.Column; 
 
import javax.persistence.Entity; 
 
import javax.persistence.FetchType; 
 
import javax.persistence.GeneratedValue; 
 
import static javax.persistence.GenerationType.IDENTITY; 
 
import javax.persistence.Id; 
 
import javax.persistence.JoinColumn; 
 
import javax.persistence.ManyToOne; 
 
import javax.persistence.Table; 
 

 
/** 
 
* RtStaffDispenser generated by hbm2java 
 
*/ 
 
@Entity 
 
@Table(name = "rt_staff_dispenser", catalog = "fdd_dbproducts") 
 
public class RtStaffDispenser implements java.io.Serializable { 
 

 
\t private Integer idrtStaffDispenser; 
 
\t private Dispenser dispenser; 
 
\t private Staff staff; 
 

 
\t public RtStaffDispenser() { 
 
\t } 
 

 
\t public RtStaffDispenser(Dispenser dispenser, Staff staff) { 
 
\t \t this.dispenser = dispenser; 
 
\t \t this.staff = staff; 
 
\t } 
 

 
\t @Id 
 
\t @GeneratedValue(strategy = IDENTITY) 
 

 
\t @Column(name = "idrt_staff_dispenser", unique = true, nullable = false) 
 
\t public Integer getIdrtStaffDispenser() { 
 
\t \t return this.idrtStaffDispenser; 
 
\t } 
 

 
\t public void setIdrtStaffDispenser(Integer idrtStaffDispenser) { 
 
\t \t this.idrtStaffDispenser = idrtStaffDispenser; 
 
\t } 
 

 
\t @ManyToOne(fetch = FetchType.EAGER) 
 
\t @JoinColumn(name = "fkdispenser_rtsdispenser", nullable = false) 
 
\t public Dispenser getDispenser() { 
 
\t \t return this.dispenser; 
 
\t } 
 

 
\t public void setDispenser(Dispenser dispenser) { 
 
\t \t this.dispenser = dispenser; 
 
\t } 
 

 
\t @ManyToOne(fetch = FetchType.EAGER) 
 
\t @JoinColumn(name = "fkstaff_rtsdispenser", nullable = false) 
 
\t public Staff getStaff() { 
 
\t \t return this.staff; 
 
\t } 
 

 
\t public void setStaff(Staff staff) { 
 
\t \t this.staff = staff; 
 
\t } 
 

 
}

誰在數據庫中有這種關係:

enter image description here

我想在休眠查詢,顯示所有的Staff INNER JOIN RtStaffDispenser ON Staff.idstaff = RtStaffDispenser.idRtsdispenser的元素。 我該怎麼做?我知道SQL INNER JOIN,但我不知道HIBERNATE INNER JOIN

JUNIT錯誤:

org.hibernate.hql.internal.ast.QuerySyntaxException: Path expected for join! [from it.jack.fdd.domain.Staff inner join RtStaffDispenser on Staff.idstaff = RtStaffDispenser.idrtStaffDispenser] 
 
\t at org.hibernate.hql.internal.ast.QuerySyntaxException.convert(QuerySyntaxException.java:91) 
 
\t at org.hibernate.hql.internal.ast.ErrorCounter.throwQueryException(ErrorCounter.java:109) 
 
\t at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:284) 
 
\t at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:206) 
 
\t at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:158) 
 
\t at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:126) 
 
\t at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:88) 
 
\t at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:190) 
 
\t at org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:301) 
 
\t at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:236) 
 
\t at org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1800) 
 
\t at it.jack.fdd.dao.impl.StaffDaoImpl.getAllA(StaffDaoImpl.java:95) 
 
\t at it.jack.fdd.tests.StaffDaoImplTest.testGetAllA(StaffDaoImplTest.java:62) 
 
\t at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
 
\t at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
 
\t at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
 
\t at java.lang.reflect.Method.invoke(Method.java:497) 
 
\t at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) 
 
\t at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
 
\t at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) 
 
\t at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) 
 
\t at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) 
 
\t at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27) 
 
\t at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) 
 
\t at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) 
 
\t at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) 
 
\t at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
 
\t at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
 
\t at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
 
\t at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
 
\t at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
 
\t at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) 
 
\t at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27) 
 
\t at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
 
\t at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) 
 
\t at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
 
\t at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) 
 
\t at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675) 
 
\t at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) 
 
\t at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)

+0

你的Rtsdispenser在rt_staff_dispenser bean中?你可以在Staff.idstaff = R上使用inner join tStaffDispenser.idrtStaffDispenser,而不是Staff.idstaff = RtStaffDispenser.Rtsdispenser。 –

+0

反正它不起作用 –

+0

JUNIT顯示以下錯誤:org.hibernate.hql.internal.ast.QuerySyntaxException:加入的路徑! [from it.jack.fdd.domain.Staff內部加入RtStaffDispenser在Staff.idstaff = RtStaffDispenser.idrtStaffDispenser] –

回答

0

解決了這種方式:

「從RtStaffDispenser選擇S R內連接河員工s「