使用复合主键时,如何在Hibernate中查询指定事件的参与者?
解决嵌入式复合主键的HQL查询问题
这问题我碰到过好多次啦——你之所以查不了pe.eventId,核心原因是eventId并不是ParticipantEntity直接拥有的字段,它是嵌套在你定义的ParticipantPrimaryKey这个**嵌入式主键(@EmbeddedId)**对象里的,所以必须通过实体里的pKey字段来访问它。
正确的HQL写法
把你的查询语句改成这样就能正常执行了:
select pe from ParticipantEntity pe where pe.pKey.eventId = ?
更推荐的命名参数写法
为了提升代码可读性、避免参数位置错位的问题,建议用命名参数代替占位符:
select pe from ParticipantEntity pe where pe.pKey.eventId = :eventId
之后在代码中设置参数时,对应使用:
query.setParameter("eventId", targetEventId);
关键注意点
- 要保证
ParticipantPrimaryKey类里的字段名确实是eventId(HQL对大小写敏感),如果你的主键类里定义的是event_id或者其他名称,HQL里要同步改成pe.pKey.event_id。 - 因为使用了
@EmbeddedId,所有主键相关的属性都必须通过这个嵌入式主键对象来访问,不能直接跳过它引用内部字段,这是JPA/HQL的规范要求哦。
内容的提问来源于stack exchange,提问作者KMO
相关产品推荐
相关产品推荐

