使用条件和sqlProjection连接表

时间:2011-02-11 16:05:17

标签: java hibernate join criteria

我有以下函数来构建一个Hibernate Criteria来生成分箱数据:

private Criteria getCustomBinResultCriteriaSQL(double binSizeX, double binSizeY, String xVar, String yVar, String customBinQuery) {
    return createCriteria(Residue.class)
            .setProjection(Projections.projectionList()
                    .add(Projections.sqlGroupProjection(
                            "floor(" + xVar + " / " + binSizeX + ") * " + binSizeX + " as xBin, " +
                                    "floor(" + yVar + " / " + binSizeY + ") * " + binSizeY + " as yBin, " +
                                    "CAST (" + customBinQuery + " AS DOUBLE PRECISION) as customBinResult",
                            "xBin, yBin",
                            new String[] { "xBin", "yBin", "customBinResult" },
                            new Type[] { Hibernate.DOUBLE, Hibernate.DOUBLE, Hibernate.DOUBLE })))
            .setResultTransformer(Transformers.aliasToBean(CustomBinResult.class));
}

对于同一个表中的数据(残差),这一切都很有效,但是假设我的数据结构是这样的:

pdbentry:
id
pdbvar

expmethod:
id
expvar

residue:
id
resvar

pdbentry与expmethod有一对一的关系,与残差有一对多的关系。

如何根据上面的标准构建器,使用expmethod加入残留表。换句话说:我需要添加什么条件才能将“expvar”作为xVar?

我尝试添加类似的内容:

.setFetchMode("pdbentry", FetchMode.JOIN);
.setFetchMode("expmethod", FetchMode.JOIN);

最后,但我仍然不能把“expvar”和“expmethod.expvar”作为xVar。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

我通过

对连接表进行别名处理
.createCriteria("rootEntity.foreignEntity", "someAlias")

这使得rootEntity.foreignEntity.someProperty可用作条件查询someAlias.someProperty(通常我选择“someAlias”与“foreignEntity”相同)。

由于我通常需要热切提取,因此我也会在createCriteria调用中使用Criteria.INNER_JOINCriteria.LEFT_JOIN

答案 1 :(得分:0)

您是否尝试过“pdbentry.expmethod.expvar”?

我不清楚(对我而言)你想要做什么,但是你定义实体关系的方式,从给定的残差访问相关的expvar的方法是“residue.pdbentry.expmethod。 expvar”。