Hibernate没有为参数指定值

时间:2015-12-19 21:14:26

标签: hibernate jpa jdbc jpql

我有一个命名查询,用于检索LIST的UgAcyearExamSchedule个内容,如下所示:

@NamedQuery(name="UgAcyearExamSchedule.getByDetail", 
query="select u FROM UgAcyearExamSchedule u where 
u.ugAcyearExamScheduleDetails=:ugDetails")

其中ugAcyearExamScheduleDetailsUgAcyearExamSchedule中定义如下:

@OneToMany(mappedBy="ugAcyearExamSchedule")
private List<UgAcyearExamScheduleDetail> ugAcyearExamScheduleDetails;

当我尝试为这些查询设置参数时如下:

Query query = em.createNamedQuery("UgAcyearExamSchedule.getByDetailAndDeptYear");
query.setParameter("ugDetails",details);
List<UgAcyearExamSchedule> examSChedules = (List<UgAcyearExamSchedule>) query.getResultList();

以下例外情况:

ERROR: No value specified for parameter
javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not extract ResultSet

我不知道这些问题的主要原因,提前谢谢

2 个答案:

答案 0 :(得分:0)

您定义名为“UgAcyearExamSchedule.getByDetail”的命名查询,但您正在调用名为“UgAcyearExamSchedule.getByDetailAndDeptYear”的命名查询。我建议你在这个其他命名查询(你还没有发布)上有一个额外的参数(deptYear?),所以它会抱怨额外的参数。

另外,您无法在JPQL中使用“collectionField =:collectionParam”。检查元素的“成员”是否更容易。

答案 1 :(得分:-1)

我相信您没有正确使用命名查询。我注意到您使用了createNamedQuery方法,但是您的命名查询已经存在;你需要打电话给它。

我认为您的em代表EntityManager或类似内容,因此如果您使用Hibernate Session Factory实例进行查询,则应尝试使用getNamedQuery代替:

Query query = session.getNamedQuery("UgAcyearExamSchedule.getByDetailAndDeptYear")
             .setParameter("ugDetails",details);

确保您的details变量实际设置为某个值。还要确保正确使用Hibernate Session。

一些可能对您有帮助的链接:)

http://www.mkyong.com/hibernate/hibernate-parameter-binding-examples/

http://www.mkyong.com/hibernate/hibernate-named-query-examples/