我试图在存储库方法上运行一个本地查询,以便返回一些计数的结果。使用JPQL实现太复杂了,因此我选择了本地查询。
存储库
@RepositoryRestResource(collectionResourceRel="projects", path="projects")
interface ProjectRepository extends BaseRepository<Project, Long>, ProjectRepositoryCustom {
@Query(
value="SELECT p.id, p.user_id, p.title, p.description, p.created_on, p.version,(SELECT COUNT(0) FROM projectparts WHERE project_id = p.id) AS parts,(SELECT COUNT(0) FROM requests WHERE project_id = p.id) AS requests FROM projects AS p ORDER BY ?#{#pageable}",
countQuery="SELECT COUNT(0) FROM projects",
nativeQuery=true
)
Page<Project> findAll(Pageable pageable)
}
该实体有2个属性被标注为
@Transient
,因此这些信息不会持久化到数据库。所有数据都返回正常,除了这2个瞬态属性,它们的值返回为null。当我从控制台复制查询并在MySQL Workbench中粘贴时,结果如预期所示,我可以看到需要的计数。无论如何,不确定是否还需要做其他工作才能使这个本地查询作为注释正常工作。我在子查询中硬编码了一个值 SELECT 55 FROM...
,只是想查看计数是否有问题,但它仍然返回null。我在Workbench中运行查询,它正常工作。我尝试更改瞬态属性类型,从
Integer、Long、BigInteger、long、int...
等类型,但没有任何区别。由于我正在使用Groovy,我还尝试了def
来让Groovy推断类型,但也没用。我还尝试从终端运行项目,但仍然没有显示计数结果。我已经在Mac和Linux上尝试过,都无法显示计数结果。
@SecondaryTable
将其他列映射到吗? - Hatem Jaber@Formula
方法,它完全按照我想要的方式工作。直到它达到1000并注意到它的积分,我才完全忘记它,想着我会将你的答案标记为正确答案,因为它确实是! - Hatem Jaber