【问题标题】:How to verify if HQL is syntactically correct (without executing it)?如何验证 HQL 在语法上是否正确(不执行)?
【发布时间】:2014-03-21 05:54:26
【问题描述】:

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

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

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

【问题讨论】:

    标签: java hibernate hql


    【解决方案1】:

    给出一个类似的查询

    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);
    

    【讨论】:

    • 谢谢,感谢您的帮助。
    【解决方案2】:

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

    【讨论】:

    • 谢谢,但希望避免执行该语句。只是想验证它的语法是否正确。
    • 我认为你可以在 IDE 级别做到这一点,但不能在应用程序代码级别。
    【解决方案3】:

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

    【讨论】:

    • 我只需要验证 HQL 在语法上是否正确。
    • 也可以,如果你的HQL不是动态查询的话。
    猜你喜欢
    • 2013-01-03
    • 1970-01-01
    • 2016-03-20
    • 2020-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多