I tried to write belowed SQL with CriteriaAPI in Hibernate 6.2.6:
select foo.id,
foo.bar,
bar.name
from foo
left join bar on bar.code = foo.bar
order by bar.name;
This is my kotlin code:
val builder = em.criteriaBuilder
val query = builder.createQuery(Any::class.java)
val root = query.from(Foo::class.java)
val sortJoin = root.join<Foo, Bar>("bar", JoinType.LEFT).get<Expression<*>>("name")
query.multiselect(root, sortJoin)
query.orderBy(builder.asc(sortJoin))
Hibernate produced result looks like:
select
s1_0.id,
s1_0.bar,
s2_0.name
from
foo s1_0
left join
bar s2_0
on s2_0.code=s1_0.bar
order by
20
I can’t understand, why did expression become a constant?
If I don’t use bar.name
in multiselect, orderBy clause is well, but YDB need it in the select.
How can I reuse expression in orderBy?
I tried to use alias, but the result is same too.
Separate expressions didn’t help too
val builder = em.criteriaBuilder
val query = builder.createQuery(Any::class.java)
val root = query.from(Foo::class.java)
val sortJoin = root.join<Foo, Bar>("bar", JoinType.LEFT).get<Expression<*>>("name")
query.multiselect(root, root.get<Path<*>>("bar").get<Expression<*>>("name"))
query.orderBy(builder.asc(sortJoin))
because every expression creates own join
select
s1_0.id,
s1_0.bar,
s3_0.name
from
foo s1_0
left join
bar s2_0
on s2_0.code=s1_0.bar
join
bar s3_0
on s3_0.code=s1_0.bar
order by
s2_0.name