【问题标题】:Referencing outer criteria query aliases from within an SQLProjection从 SQLProjection 中引用外部条件查询别名
【发布时间】:2011-12-10 23:33:04
【问题描述】:

我知道您可以使用 {alias} 来引用 SQLProjection 中的根实体:

Projections.sqlProjection("MIN({alias}.field) as value", new String[]{"value"}, new Type[]{new LongType()}))

我想要做的是为一个 non-root 实体引用一个别名:

Projections.sqlProjection("MIN(i.powerRestarts) as value", new String[]{"value"}, new Type[]{new LongType()}))

其中i 是外部条件查询的别名。上面的代码抛出了一个 SQL 异常,提示找不到 i.powerRestarts

是否可以从 SQLProjection 引用非根别名?

【问题讨论】:

    标签: java hibernate hibernate-criteria


    【解决方案1】:

    进行了一些谷歌搜索后,这似乎是不可能的 - Hibernate 只允许在SQLProjection 的 SQL 字符串中包含使用 {alias} 的根实体别名。然而,我确实在 Hibernate JIRA 页面上找到了this issue regarding the limitation

    有人通过新的RestrictionsExt 类提交了一个允许在SQLProjection 字符串中使用非根别名的补丁。使用我在问题中的示例:

    Projections.sqlProjection("MIN(i.powerRestarts) as value", new String[]{"value"}, new Type[]{new LongType()}))
    

    别名 i 现在可以引用为:

    RestrictionsExt.sqlProjection("MIN({i}.powerRestarts) as value", "value", new LongType())
    

    我不得不修改静态 RestrictionsExt.sqlProjection 方法以允许指定列别名 ("value") 的类型(此处定义为 LongType),因为补丁不允许这样做并且默认为 @987654332 @。

    补丁中的 SQLAliasedProjection 类还需要访问org.hibernate.loader.criteria.CriteriaQueryTranslator 中的以下私有方法:getOuterQueryTranslatorgetAliasedCriteria。为了在不修改 Hibernate 源的情况下使其工作,我使用了反射:

    cri = ((org.hibernate.loader.criteria.CriteriaQueryTranslator) criteriaQuery).getAliasedCriteria(alias);
    

    改为:

    Method m = ((org.hibernate.loader.criteria.CriteriaQueryTranslator) criteriaQuery).getClass().getDeclaredMethod("getAliasedCriteria", String.class);
    m.setAccessible(true);
    cri = (Criteria) m.invoke(((org.hibernate.loader.criteria.CriteriaQueryTranslator) criteriaQuery), alias);
    

    希望这能帮助其他面临同样问题的人。

    【讨论】:

      猜你喜欢
      • 2019-06-21
      • 1970-01-01
      • 1970-01-01
      • 2012-11-09
      • 1970-01-01
      • 1970-01-01
      • 2011-06-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多