java - 如何获取没有别名的hibernate生成的sql

标签 java sql hibernate criteria

我正在研究一个具有给定条件的函数,返回它的 sql,但我得到带有条件别名的 sql。
那么,有没有办法保留数据库中的原始列名,而不是用别名替换?

功能:

    public String getReportSQL(Criteria criteria) {
        try {
            CriteriaImpl c = (CriteriaImpl) criteria;
            SessionImpl s = (SessionImpl)c.getSession();
            SessionFactoryImplementor factory = (SessionFactoryImplementor)s.getSessionFactory();
            String[] implementors = factory.getImplementors( c.getEntityOrClassName() );
            CriteriaLoader loader = new CriteriaLoader((OuterJoinLoadable)factory.getEntityPersister(implementors[0]),
                    factory, c, implementors[0], s.getLoadQueryInfluencers());

            Field f = OuterJoinLoader.class.getDeclaredField("sql");
            f.setAccessible(true);
            return (String) f.get(loader);
       } catch(Exception e){
           throw new RuntimeException(e);
       }
    }

得到了:

    select this_.CAR_KEY as CAR_11_0_ from DATABASE.CAR this_

预期的:

    select CAR_KEY from DATABASE.CAR

提前致谢

最佳答案

声明字段“sql”的默认 Java 实现是您所获得的,我认为没有一种简单的方法可以将其更改为您想要的方式。

我的建议是解析您收到的字符串。

return ((String) f.get(loader)).replaceAll("this_.", "").replaceAll("this_", "").replaceAll("( as \\w)\\w+", "")

结果将是:

select CAR_KEY from DATABASE.CAR

关于java - 如何获取没有别名的hibernate生成的sql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59751546/

相关文章:

java - 为什么 SqlExceptionHelper 将 boolean 约束冲突解释为\x00

java - 当键的一个元素是实体时,如何在 JPA 中声明复合键?

java - @EmbeddedId 如何构造其复合主键?

java - Drools:mvel 和 java 方言之间的差异

java - 向 Spark 数据集添加列并转换数据

sql - 如何仅按月和年分组?

sql - Java 8 流与 jpa postgresql 排序依据。什么对性能更好?

sql - 动态创建列sql

java - 使用服务时 MediaPlayer 无法开始播放?

java - 使用java获取一条记录的多个连接VS获取Mysql中所有记录的一个连接