【发布时间】:2014-03-21 05:54:26
【问题描述】:
是否有一种简单的方法(通过 Java 代码)来验证 HQL 在语法上是否正确?
一种方法当然是执行它并捕获异常。但我想避免触发查询。
在我的例子中,HQL 是根据用户的选择动态生成的,有时用户甚至可以手动输入。因此,我想验证 HQL 的格式是否正确。
【问题讨论】:
是否有一种简单的方法(通过 Java 代码)来验证 HQL 在语法上是否正确?
一种方法当然是执行它并捕获异常。但我想避免触发查询。
在我的例子中,HQL 是根据用户的选择动态生成的,有时用户甚至可以手动输入。因此,我想验证 HQL 的格式是否正确。
【问题讨论】:
给出一个类似的查询
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);
【讨论】:
如果您只想确保 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();
}
【讨论】:
在我的开发中,有很多Entity、OR mapping和Name queries。
他们最简单的方法是我使用Transaction 来检查是否正确。
我在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();
}
Console 将显示缺失的状态/错误。如果您的开发过程不正确。
【讨论】: