这是我的代码
session = HibernateUtil.getSession();
String sqlQuery = "from FacultyAchievements fa where fa.isActive = 1";
Query query = session.createQuery(sqlQuery);
if(facultyAchievementsForm.getFilterAcademicYear() != null && !facultyAchievementsForm.getFilterAcademicYear().isEmpty())
{
sqlQuery += " and fa.academicYear = :academicYear";
query = session.createQuery(sqlQuery);
query.setString("academicYear",facultyAchievementsForm.getFilterAcademicYear());
}
if(facultyAchievementsForm.getEmployeeId() != null && !facultyAchievementsForm.getEmployeeId().isEmpty())
{
sqlQuery += " and fa.employee.employee.id = :employeeId";
query = session.createQuery(sqlQuery);
query.setInteger("employeeId", Integer.parseInt(facultyAchievementsForm.getEmployeeId()));
}
List<FacultyAchievements> achivementsList = query.list();
session.flush();
if(achivementsList != null)
return achivementsList;
else
return new ArrayList<FacultyAchievements>();
我得到的例外是 -
org.hibernate.QueryException:并未设置所有已命名的参数
但是我已经正确设置了所有参数,所以我怀疑是由于多次重新初始化Query
导致了问题。对不起,如果我错了。
答案 0 :(得分:0)
当您明确使用Hibernate会话时,使用普通的sql没有意义,Criteria api或HQL将是更好的选择。如果您想保持独立供应商,可以使用JPA named queries。
要解决您的问题,请重构您的代码:
if (a)
sqlQuery += "a...";
if (b)
sqlQuery += "b...";
query = session.createQuery(sqlQuery);
if (a)
query.setParam(...
if (b)
query.setParam(...
答案 1 :(得分:0)
session.createQuery(sqlQuery);
会返回新的查询对象。您只在if块中为查询对象设置一个参数。在第二个if块中,您没有将param设置为您在first if block中创建的同一查询对象。你的代码有bug。