2013-07-17 45 views
0

這HQL導致極大幫助的「錯誤命名查詢」消息HQL錯誤命名查詢子查詢

"FROM courseform c WHERE c.application.application IN 
(SELECT a.application FROM application a WHERE a.applicant=: applicant)" 

的CourseForm具有與該應用程序OneToOne單向關係(如果它會這個可能就是雙向的幫幫我)。反過來,申請人與申請人具有相同的單向OneToOne關係。一個申請人可以有很多申請。

下面是(刪節)定義

CourseForm

@Entity 
@NamedQueries({ 
       @NamedQuery(name = "CourseForm.findByApplicant", 
query = "FROM courseform c WHERE c.application.application IN 
(SELECT a.application FROM application a WHERE a.applicant=: applicant)") }) 
public class CourseForm implements Serializable { 

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
long id; 

@Enumerated(EnumType.STRING) 
private Career career; 
private String academicPlan; 
private String courseName; 
@Enumerated(EnumType.STRING) 
private ModeOfAttendance modeOfAttendance; 

@OneToOne 
@JoinColumn(name = "application_fk") 
    private Application application; 
... 
} 

應用

@Entity 
public class Application implements Serializable { 


@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
long applicationNumber; 

@OneToOne 
@JoinColumn(name = "applicant_fk") 
private Applicant applicant; 

@Type(type = "org.jadira.usertype.dateandtime.joda.PersistentLocalDateTime") 
private LocalDateTime lastUpdate = LocalDateTime.now(); 
@Type(type = "org.jadira.usertype.dateandtime.joda.PersistentLocalDateTime") 
private LocalDateTime submitted = null; 

public Application() { 
} 

申請人

@Entity 
    @NamedQueries({ @NamedQuery(name = "Applicant.findByApplicantID", 
query = "FROM Applicant a WHERE a.applicantID= :applicantID") }) 
public class Applicant implements Serializable { 

    private static final long serialVersionUID = -7210042752148566673L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    long id; 
    private String applicantID; 

    Applicant() { 
    } 

回答

1

好吧,根據馬克,正確的答案是

FROM courseform c WHERE c.application.applicant =: applicant 
+0

我也引用了CourseForm到應用程序關係中的列名稱,並且向Applicant申請了一個ManyToOne關係,也引用了列名。 –

0

我認爲錯誤是FROM courseform c WHERE c.application.application。你已經在where子句中使用c.application.application
應該FROM courseform c WHERE c.application

+0

這可能是如此,但它不是唯一的問題 - 如果我做這個改變,同樣的錯誤是可見的。 –

0

可以更改爲:

FROM courseform c WHERE c.application.applicationNumber IN (SELECT a.applicationNumber FROM application a WHERE a.applicant=: applicant) 
+0

我可以,但不幸的是沒有任何區別。 –

+0

你能發佈完整的stacktrace錯誤嗎? –

+0

我看不出這將有助於多,但這裏是由引起有點 :org.hibernate.HibernateException:在org.hibernate.internal.SessionFactoryImpl CourseForm.findByApplicant \t:錯誤的命名查詢。 (SessionFactoryImpl.java:526) \t在org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1743) \t在org.hibernate.ejb.EntityManagerFactoryImpl。 (EntityManagerFactoryImpl.java:94) \t在org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:905) \t ... 57多個 –