java - Hibernate:从部分解析/翻译 HQL 以获取对类别名、类名

标签 java hibernate hql

任何人都可以指出我如何解析/评估 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/

相关文章:

java - Spring 启动+ Spring 数据休息: post json null value in column "first_name" violates not-null constraint

java - 查询结果上的transformTuple和For循环之间的区别 - Hibernate

java - Spring Boot 中的 CORS 不起作用 - 得到空响应

java - 在保存 hibernate 实体时忽略 transient 模式

hibernate - JPA 双向关系的优缺点

java - HQL - 基于列的条件 WHERE 子句

java - 如何在 HQL 中使用 order by?

java - 大整数输入超时

java - 空指针Zxing扫描仪

java - JDOM、XPath 和 namespace 交互