有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

一种方法当然是执行它并捕获异常。但我想避免引发质疑

在我的例子中,HQL是根据用户的选择动态生成的,有时用户甚至可以手动输入。因此,我想验证HQL的格式是否正确


共 (3) 个答案

  1. # 1 楼答案

    在我的开发中,有很多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将显示缺少的状态/错误。如果您的开发过程不正确

  2. # 2 楼答案

    提出这样的问题

    final String theQuery = "update Person p set ps.count = (p.count + ?) where id = ?";

    快速方式,但需要添加监听器,且不精确

    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);
    
  3. # 3 楼答案

    如果您只想确保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();
    }