将SQL语句转换为Hibernate Criteria或Projections

时间:2014-08-15 01:54:13

标签: sql hibernate hibernate-criteria

我希望将此SQL语句转换为条件或预测。对不起,我不知道使用哪一个,因为我是Hibernate的新手。我做过一些研究,看起来两者都需要达到我想要的效果。

在我总是在我的程序中使用SQL语句之前,但是当我看到一个示例代码允许您创建查询而不使用Criteria编写SQL语句时,我想使用它,因为它为我提供了更清晰的代码。

提前致谢。

String query = "SELECT MAX(employeeNo) "
    + "FROM Profile "
    + "WHERE SUBSTRING(employeeNo,1,2)='" + yy + "'";

empNo = session.createQuery(query).list().get(0).toString();

此查询获取给定年份yy的数据库中的最高员工编号。 示例结果为14-229

1 个答案:

答案 0 :(得分:1)

这假设您已经为Profile实体定义了一个映射。

Session session = sessionFactory.getCurrentSession();
String empNo = (String) session
     .createCriteria(Profile.class)
     .add(Restrictions.sqlRestriction("substring(employeeNo,1,2) = ?", yy, StringType.INSTANCE)
     .setProjection(Projections.max("employeeNo"))
     .uniqueResult();

现在,我不知道我是否同意你的陈述,即这是更清洁。使用Criteria的好处是可以让你动态地建立一个标准,但是它非常冗长,并且它并不清楚你乍一看你想要做什么。另外,由于子字符串函数,强制您混合使用sqlRestriction。相反,您可以使用HQL:

Session session = sessionFactory.getCurrentSession();
String empNo = (String) session.createQuery("SELECT MAX(employeeNo) FROM Profile WHERE substring(employeeNo,1,2) = :year")
     .setString("year", yy)
     .uniqueResult();

就个人而言,我认为HQL甚至SQL方法都更清晰,并且更好地表达了意图。