Can you share buildQuery? The def o1 = owner AST trick requires the literal
Domain.where { ... } form; if your builder composes criteria programmatically,
the alias won't be registered and the sort will silently drop.
James
On 2026/04/16 13:31:10 Gianluca Sartori wrote:
> Hi folks,
>
> do you have evidence that the where query aliases are working for sorting?
> It does not seem to work in my code.
>
> The only difference I see is that I sort multiple columns with something
> like:
>
> def query = buildQuery(filterParams)
> return query.list(sort: ['o1.firstName': 'desc'])
>
>
>
> >>>
> 7.4.6. Query Aliases and Sorting
>
> If you define a query for an association an alias is automatically
> generated for the query. For example the following query:
>
> def query = Pet.where {
> owner.firstName == "Fred"
> }
>
> Will generate an alias for the owner association such as owner_alias_0.
> These generated aliases are fine for most cases, but are not useful if you
> want to later sort or use a projection on the results. For example the
> following query will fail:
>
> // fails because a dynamic alias is used
> Pet.where {
> owner.firstName == "Fred"
> }.list(sort:"owner.lastName")
>
> If you plan to sort the results then an explicit alias should be used and
> these can be defined by simply declaring a variable in the where query:
>
> def query = Pet.where {
> def o1 = owner
> o1.firstName == "Fred"
> }.list(sort:'o1.lastName')
>
> Define an alias called o1
> Use the alias in the query itself
> Use the alias to sort the results
>
> By assigning the name of an association to a local variable it will
> automatically become an alias usable within the query itself and also for
> the purposes of sorting or projecting the results.
>
>
>
> Gianluca Sartori
> --
> https://dueuno.com
>