Объединение таблиц с использованием критериев и sqlProjection - PullRequest
0 голосов
/ 11 февраля 2011

У меня есть следующая функция, которая строит критерии гибернации для генерации двоичных данных:

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 ]

1 голос
/ 10 января 2012

Я создаю псевдоним объединяемых таблиц с помощью

.createCriteria("rootEntity.foreignEntity", "someAlias")

. Это делает rootEntity.foreignEntity.someProperty доступным для запроса Criteria как someAlias.someProperty (обычно я выбираю "someAlias" так же, как "foreignEntity").

Поскольку я обычно хочу активную выборку, у меня, как правило, также есть Criteria.INNER_JOIN или Criteria.LEFT_JOIN для вызова createCriteria.

0 голосов
/ 22 февраля 2011

Вы пробовали "pdbentry.expmethod.expvar"?

Не ясно (для меня), что вы пытаетесь сделать из этого, но как вы определяете свои отношения сущностей, путь кполучить доступ к соответствующему expvar из данного остатка будет "Остаток.pdbentry.expmethod.expvar".

...