Spring中能否在@Query内获取对象ID?JPA查询语法疑问
问题解答
1. 是否支持ps.idspeciality.id = ?1语法?
完全支持。JPQL(Java Persistence Query Language)允许通过实体关联属性直接访问其主键字段,这种写法合法且常用,刚好能解决你当前的类型不匹配问题——ps.idspeciality是Specialities实体对象,通过.id可直接获取它的主键值,与传入的Integer类型参数?1做比较。
2. 最简洁的修改方案
直接修改@Query语句中的匹配条件,将ps.idspeciality = ?1替换为ps.idspeciality.id = ?1即可,修改后的完整代码如下:
@Query("SELECT p " + "FROM Physicians p " + "JOIN Physicianspecialities ps ON (ps.idphysician = p.id AND ps.idspeciality.id = ?1 AND ps.validfrom <= ?2 AND (ps.validto >= ?2 OR ps.validto IS NULL)) " + "JOIN Personnel pe ON (pe.id = p.idPersonnel and pe.validfrom <= ?2 AND (pe.validto >= ?2 OR pe.validto IS NULL)) " + "ORDER BY p.id DESC") List<Physicians> getAllByDateAndSpeciality(Integer idSpeciality, Date date);
这种方式无需修改实体结构、额外添加JOIN关联或创建实体对象,是最直接简洁的解决办法。
3. 查询语言的文档来源
@Query注解默认使用JPQL,相关文档可参考:
- Jakarta Persistence官方规范文档(JPQL是其中的核心查询语言模块)
- Spring Data JPA官方参考文档中关于JPQL查询的章节
内容的提问来源于stack exchange,提问作者Victorqedu
相关产品推荐
相关产品推荐

