可以多次重新初始化Query吗?

时间:2016-09-03 12:46:16

标签: hibernate

这是我的代码

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导致了问题。对不起,如果我错了。

2 个答案:

答案 0 :(得分:0)

当您明确使用Hibernate会话时,使用普通的sql没有意义,Criteria apiHQL将是更好的选择。如果您想保持独立供应商,可以使用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。