2013-07-17 39 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多个 –