如何验证HQL在语法上是否正确(不执行它)?

时间:2014-03-21 05:54:27

标签: java hibernate hql

是否有一种简单的方法(通过Java代码)来验证HQL在语法上是否正确?

一种方法肯定是执行它并捕获异常。但我想避免触发查询。

在我的情况下,HQL是根据用户的选择动态生成的,有时用户甚至可以手动输入。因此,我想验证HQL是否处于正确的形式。

3 个答案:

答案 0 :(得分:3)

提供类似

的查询
  

final String theQuery ="更新Person p set ps.count =(p.count +?)其中id =?&#34 ;;

快捷方式,但需要添加监听器而不是精确

HqlParser parser = HqlParser.getInstance(theQuery);
parser.statement();
parser.getAST() /*if null probably an error occurred*/

更精确的方式

final SessionFactoryImplementor sfi = (SessionFactoryImplementor) sf;
final QueryTranslatorFactory qtf = sfi.getSettings().getQueryTranslatorFactory();
qtf.createQueryTranslator("myQuery", theQuery, new HashMap(), sfi).compile(new HashMap(), false);

答案 1 :(得分:1)

如果您只想确保正确形成hql,那么我建议您只在事务中包装语句,然后尝试执行该语句。当然,如果HQL无效,它将引发错误,捕获该异常然后执行回滚以防止对数据库进行任何更改。

Session sess = factory.openSession();
Transaction tx;

try {
    tx = sess.beginTransaction();
    //execute the hql. will throw an error if not a valid one
    //...

    //commit if hql is not malformed
    tx.commit();
}
catch (Exception e) {
    if (tx!=null) tx.rollback(); //hql not valid. rollback
    throw e;
}
finally {
    sess.close();
}

答案 2 :(得分:0)

在我的开发中,有很多EntityOR mappingName queries。 最简单的方法是使用Transaction检查是否正确。

我在JPA中使用如下。我相信可能还有一种方法HibernateHQL

public static void main(String args[]) {
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("JPA");
    EntityManager em = emf.createEntityManager();
    em.getTransaction().begin();
    em.getTransaction().commit();
    em.close();
    emf.close();
}

Console将显示缺少的状态/错误。如果您的开发过程不正确。