Hibernate: Parse/Translate HQL FROM part to get pairs class alias, class name(Hibernate:从部分解析/转换HQL,以获得类别名、类名对)
本文介绍了Hibernate:从部分解析/转换HQL,以获得类别名、类名对的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
谁能告诉我,如何解析/评估HQL并获得key是表别名和值的全限定类名的映射。
例如HQL
从foo a内部联接中选择a.id。测试b
我希望有对:
a,Package1.foo
b.Package2.TestClassName
对结果集执行此操作相对容易
HQLQueryPlan hqlPlan = ((SessionFactoryImpl)sf).getQueryPlanCache().getHQLQueryPlan( getQueryString(), false, ((SessionImpl)session).getEnabledFilters() ); String[] aliases = hqlPlan.getReturnMetadata().getReturnAliases(); Type[] types = hqlPlan.getReturnMetadata().getReturnTypes();
参见details here。
推荐答案
这不是一个好方法,但您似乎可以通过一些内部接口获取AST并遍历以下内容:
QueryTranslator[] translators = hqlPlan.getTranslators();
AST ast = (AST)((QueryTranslatorImpl)translators[0]).getSqlAST();
new NodeTraverser(new NodeTraverser.VisitationStrategy() {
public void visit(AST node) {
if(node.getType() == SqlTokenTypes.FROM_FRAGMENT || node.getType() == SqlTokenTypes.JOIN_FRAGMENT) {
FromElement id = (FromElement)node;
System.out.println(node+": "+id.getClassAlias()+" - "+id.getClassName());
}
}
}).traverseDepthFirst(ast);
因此,这似乎是从编译后的查询中检索别名映射,但我在使用此解决方案时会非常小心:它将对象类型转换为Hibernate客户端通常不可见的子类,并基于猜测不同节点的语义来解释AST。这可能不适用于所有HQL语句,并且可能不适用于未来的Hibernate版本,或者具有不同的行为。
这篇关于Hibernate:从部分解析/转换HQL,以获得类别名、类名对的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
编程基础网
本文标题为:Hibernate:从部分解析/转换HQL,以获得类别名、类名对
基础教程推荐
猜你喜欢
- 控制台应用程序中的 Java 键盘输入解析 2022-01-01
- JPA惰性列表上的流 2022-01-01
- Maven:无效的目标版本:10 2022-01-01
- doFilter()是在servlet的工作完成之前还是之后执行的? 2022-01-01
- Java ECDSAwithSHA256 签名长度不一致 2022-01-01
- 在java中使用xpath和selenium解析HTML表格数据 2022-01-01
- 在springboot中如何给mybatis加拦截器 2023-04-29
- 如何在相机中应用自定义滤镜 [Surfaceview 预览]. 2022-01-01
- 将 double 转换为 Int,向下舍入 2022-01-01
- 将 Windows 证书导入 Java 2022-01-01
