- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我知道您可以使用 {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)方法:getOuterQueryTranslator
和 getAliasedCriteria
。为了在不修改 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/
我有这种情况: public class AnswerSet { public virtual IList Answers {set; get;} } session.CreateCriteria()
我有以下函数来构建 Hibernate Criteria 以生成分箱数据: private Criteria getCustomBinResultCriteriaSQL(double binSizeX
我知道您可以使用 {alias} 来引用 SQLProjection 中的根实体: Projections.sqlProjection("MIN({alias}.field) as value", n
我正在尝试编写查询以根据聚合列计算排名列。该查询是一个 SQLProjection,作为 Hibernate Criteria 查询的一部分。 这是我尝试过的: String sqlProjectio
我是一名优秀的程序员,十分优秀!