任何人都可以指出我如何解析/评估 HQL 并获取映射,其中键是表别名和值 - 完全限定的类名。
例如对于 HQL
SELECT a.id from Foo a INNER JOIN a.test b
我想要一对:
a, package1.Foo
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 .
最佳答案
这不是一个好方法,但似乎你可以通过一些内部接口(interface)获取 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 语句,并且可能不适用于 future 的 hibernate 版本,或者有不同的行为。
关于java - Hibernate:从部分解析/翻译 HQL 以获取对类别名、类名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/324105/