Hibernate Criteria API - доступ к объединенным свойствам - PullRequest
2 голосов
/ 26 марта 2012

У меня довольно сложные критерии, которые я использую для извлечения, сортировки и просмотра данных на стороне сервера.Я сократил следующую выдержку:

    // create criteria over a bunch of tables...
    Criteria testCriteria = getSession().createCriteria(PriceRequest.class)
            .setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY)
            .setFetchMode("pricedBy", FetchMode.JOIN)
            .setFetchMode("canceledBy", FetchMode.JOIN)
            .setFetchMode("product", FetchMode.JOIN)
            .setFetchMode("product.underlyings", FetchMode.JOIN)
            .setFetchMode("product.tradedBy", FetchMode.JOIN)
            .setFetchMode("product.requestedBy", FetchMode.JOIN)
            .setFetchMode("fileUploads", FetchMode.JOIN);

    // add various filter fields (only if required in real code)...
        Criteria subCriteria = testCriteria
                .createCriteria("product", JoinFragment.LEFT_OUTER_JOIN)
                .setFetchMode("underlyings", FetchMode.JOIN)
                .add(Restrictions.ge("maturityDate", new Date()));

        testCriteria.addOrder(Order.desc("product.id")); // (1)
        testCriteria.addOrder(Order.desc("product.maturityDate")); // (2)

        List list = testCriteria.list();

Оператор (1) работает нормально, оператор (2) заканчивается следующим исключением:

SEVERE: Servlet.service () дляостальные сервлеты сгенерировали исключение org.hibernate.QueryException: не удалось разрешить свойство: product.maturityDate of: com.my.model.PriceRequest

Я выбрал "maturityDate" в качестве примера, но у меняэто относится ко всем свойствам продукта, кроме "product.id".

Я также попытался добавить псевдоним для продукта ("prod").Это позволяет сортировать по дате погашения («prod.maturityDate»), но не удается добавить ограничение к подкритериям.

Я так сильно не понимаю, что происходит ...

1 Ответ

2 голосов
/ 29 марта 2012

createCriteria (ассоциация) не создает псевдоним, но вам нужен один для заказа.

Также вы не можете отфильтровать ассоциацию и получить ее, потому что вы можете отфильтровать сущности ассоциации, которые необходимы для инициализации.следовательно, fetchmode игнорируется.Используйте коррелированный подзапрос

// create criteria over a bunch of tables...
Criteria testCriteria = getSession().createCriteria(PriceRequest.class)
        .setFetchMode("pricedBy", FetchMode.JOIN)
        .setFetchMode("canceledBy", FetchMode.JOIN)
        .createAlias("product", "prod")
        .setFetchMode("prod.underlyings", FetchMode.JOIN)
        .setFetchMode("prod.tradedBy", FetchMode.JOIN)
        .setFetchMode("prod.requestedBy", FetchMode.JOIN)
        .setFetchMode("fileUploads", FetchMode.JOIN)
        .addOrder(Order.desc("prod.maturityDate"));       // (2)

// add various filter fields (only if required in real code)...
if (...)
{
    Criteria subCriteria = getSession().createCriteria(PriceRequest.class)
        .createCriteria("product", JoinFragment.LEFT_OUTER_JOIN)
        .add(Restrictions.ge("maturityDate", new Date()));
        .setResultTransformer(Projection.id)

    testCriteria = testCriteria
        .add(Subqueries.PropertyIn("id", subCriteria));
        .setFetchMode("underlyings", FetchMode.JOIN)
}

List list = testCriteria.list();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...