Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何验证HQL是否语法正确(不执行它)?_Java_Hibernate_Hql - Fatal编程技术网

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

Java 如何验证HQL是否语法正确(不执行它)?,java,hibernate,hql,Java,Hibernate,Hql,是否有一种简单的方法(通过Java代码)来验证HQL的语法是否正确 一种方法当然是执行它并捕获异常。但我想避免引发质疑 在我的例子中,HQL是根据用户的选择动态生成的,有时用户甚至可以手动输入。因此,我想验证HQL的格式是否正确。在我的开发中,有许多实体、或映射和名称查询。 他们最简单的方法是我用事务检查它们是否正确 我在JPA中使用了如下内容。我相信也有办法Hibernate和HQL public static void main(String args[]) { EntityMana

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

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


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

在我的开发中,有许多
实体
或映射
名称查询
。 他们最简单的方法是我用
事务
检查它们是否正确

我在
JPA
中使用了如下内容。我相信也有办法
Hibernate
HQL

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

控制台
将显示缺失状态/错误。如果您的开发过程不正确。

如果您只想确保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();
}
提出这样的问题

最后一个字符串theQuery=“updateperson p set ps.count=(p.count+?),其中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);

谢谢,但我想避免执行该语句。我只想验证它的语法是否正确。我认为您可以在IDE级别完成,但不能在应用程序代码级别完成。我只需要验证HQL的语法是否正确。如果您的HQL不是动态查询,也可以。谢谢,感谢您的帮助。