Обойти отсутствие поддержки sqlProjection в построителе критериев? - PullRequest
2 голосов
/ 11 августа 2011

http://jira.grails.org/browse/GRAILS-2803 касается отсутствия поддержки sqlProjection.Он был закрыт как дубликат и предположительно исправлен в Grails v1.2.Но «дублирующая» проблема касалась sqlRestriction, и я не верю, что sqlProjection реализован как минимум начиная с Grails v1.3.2.

Есть ли обходные пути для использования sqlProjection внутри critera?Например,

def results = Report.createCriteria() list {
            projections {
                sum('correctResponses')
                sum('allResponses')

                sqlProjection("(sum(correct_responses) / sum(all_responses))", ["grade"] as String[], [Hibernate.INTEGER] as Type[])
                groupProperty('name')
            }
            and {
                if (startDate)
                    ge("date", startDate)

                if (endDate)
                    lt("date", endDate + 1) //add one day so search is inclusive of end date

                'in' ("id", ids)
            }
            order(orderColumn ?: 'name', orderDirection ?: 'asc')
        }

1 Ответ

5 голосов
/ 03 января 2012

У меня была похожая проблема, и я нашел решение в ответе на другой вопрос.

Вы можете обойти эту проблему, используя метод addProjectionToList ().Посмотрите на «Вариант 2» в следующем ответе для примера:

https://stackoverflow.com/a/7652787

Критерии DSL для этого конкретного примера будут следующими:

def results = Report.createCriteria().list {
    projections {
        sum('correctResponses')
        sum('allResponses')

        addProjectionToList(Projections.sqlProjection(
            '(sum(correct_responses) / sum(all_responses)) as grade',
            ['grade'] as String[],
            [Hibernate.INTEGER] as Type[]
        ), 'sumProjection')
        groupProperty('name')
    }
    and {
        if (startDate)
            ge("date", startDate)

        if (endDate)
            lt("date", endDate + 1) //add one day so search is inclusive of end date

        'in'("id", ids)
    }
    order(orderColumn ?: 'name', orderDirection ?: 'asc')
}
...