是否有一种简单的方法(通过Java代码)来验证HQL在语法上是否正确?
一种方法肯定是执行它并捕获异常。但我想避免触发查询。
在我的情况下,HQL是根据用户的选择动态生成的,有时用户甚至可以手动输入。因此,我想验证HQL是否处于正确的形式。
答案 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)
在我的开发中,有很多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
将显示缺少的状态/错误。如果您的开发过程不正确。