首页 > 解决方案 > 使用 QueryDsl 从子查询创建别名

问题描述

我的目标是改变这个SQL query

select a.*, (select count(DOGS.DOG_ID) from DOGS where a.DOG_ID = 
DOGS.DOG_ID) cnt
from ANIMALS a
order by cnt desc ;

我创建一个QueryDsl这样的查询:

createQuery()
            .select(Projections.constructor(AnimalsDto.class, animal.animalId, animal.firstName,
                    Expressions.as(subQueryForDogsCount(dogs, animal), "cnt")))
            .from(animal).orderBy(new OrderSpecifier<>(Order.ASC, Expressions.asString("cnt"))).fetch();

而这subQueryForDogsCount只是:

JPAExpressions.select(dogs.count()).from(dogs)
            .where(dogs.dogId.eq(animal.dogId));

当我记录该查询时,我得到如下信息:

[select 
animal.animalId, 
prospect.firstName,  
(select count(DOGS.dogId)
from DOGS dogs
where dogs.dogId = animal.dogId) as cnt
from ANIMAL animal
order by ?1 desc]

当我想执行它时,我得到一个NullPointerExpception,我认为问题可能出在最后一个清单上?1:为什么querydsl看不到这个别名?也许还有其他方法可以为它创建别名?

标签: javahibernatejpajakarta-eequerydsl

解决方案


推荐阅读