Java 如何以编程方式验证JPQL(JPA查询)

Java 如何以编程方式验证JPQL(JPA查询),java,spring,jpa,eclipselink,jpql,Java,Spring,Jpa,Eclipselink,Jpql,我正在寻找一种以编程方式验证JPA查询的方法 在(Spring)事务中,我有一个要运行的查询列表。这些查询可能包含语法错误,我希望捕获这些错误,以便事务可以继续 我的第一个想法是使用EntityManager创建并执行我的查询,如果查询失败,我可以简单地捕获异常,记录警告并继续 问题是,当出现问题时,事务只会标记为回滚,这样我的当前事务就会回滚,这不是我想要的 在伪代码中,大致如下所示: EntityManager em = ...; em.getTransaction().begin(

我正在寻找一种以编程方式验证JPA查询的方法

在(Spring)事务中,我有一个要运行的查询列表。这些查询可能包含语法错误,我希望捕获这些错误,以便事务可以继续

我的第一个想法是使用
EntityManager
创建并执行我的查询,如果查询失败,我可以简单地捕获异常,记录警告并继续

问题是,当出现问题时,事务只会标记为回滚,这样我的当前事务就会回滚,这不是我想要的

在伪代码中,大致如下所示:

  EntityManager em = ...;
  em.getTransaction().begin();
  List<String> queries = Arrays.asList("select e from Department d", 
             "select d from Department d");
  for(String query:queries) {
       TypedQuery<Department> typedQuery = em.createQuery(query, Department.class); // This can throw an exception
       List<Department> deps = typedQuery.getResultList(); // This can also throw an exception
       //... do some stuff with the departements
  }
EntityManager em=。。。;
em.getTransaction().begin();
列表查询=Arrays.asList(“从部门d中选择e”,
“从部门d中选择d”);
for(字符串查询:查询){
TypedQuery TypedQuery=em.createQuery(query,Department.class);//这会引发异常
List deps=typedQuery.getResultList();//这也会引发异常
//…对部门做些事情
}
到目前为止,我发现的另一种选择是从原来的
EntityManager
em.getEntityManager().createEntityManager()
)创建另一个
EntityManager,首先在该查询中运行我的查询,然后在原来的查询中重新执行它们(如果成功的话),但这确实没有效率,而且看起来很难看


我正在使用EclipseLink作为JPA实现,无法切换到其他JPA实现。

我想您需要JPQL的complile时间验证。无法检查查询语法是否正确

为了完成您想要的工作,请使用CriteriaAPI而不是JPQL。
检查标准api的文档。您将需要使用元模型进行编译时检查

EclipseLink应该有一个
jpql.validation
扩展,它可以使用HermesParser验证jpql表达式。如果您可以使用注释,那么很遗憾,可能类似于@Transactional(norollboor=badsqlgramarException.class)@6ton的东西,这是eclipselink(也许还有JPA)内部的东西,因此,修改注释不会改变任何事情。@meskobalazs您有关于该解析器的其他信息以及如何使用它吗?请尝试查看嵌套工作单元文档中的要点是,嵌套工作单元的失败不会影响父工作单元中其他操作的提交或回滚事务。希望这是您正在寻找的一个我如何使用CriteriaBuilder和从数据库获取的字符串?请查看官方文档:Criteria api使用对象级操作。我知道,但在这种情况下不能使用,因为查询是由用户在数据库中编写的。如果我理解正确,要运行的查询是从数据库中的其他用户编写的,然后您检索它们。