gpt4 book ai didi

java - 从 SQLProjection 中引用外部条件查询别名

转载 作者:搜寻专家 更新时间:2023-10-30 21:07:09 25 4
gpt4 key购买 nike

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

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

我想做的是引用一个非根实体的别名:

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

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

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

最佳答案

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

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

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 ),因为补丁不允许这样做,默认为 StringType

补丁中的 SQLAliasedProjection 类还需要访问 org.hibernate.loader.criteria.CriteriaQueryTranslator 中的以下私有(private)方法: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);

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

关于java - 从 SQLProjection 中引用外部条件查询别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7822662/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com