我有一个扩展CrudRepository的接口,并使用 @Query 注释实现一个方法,其中 nativeQuery 属性设置为true。此方法返回实体列表。
示例:
public interface MessageTemplateRepository extends CrudRepository<MessageTemplate, Integer> {
@Query(nativeQuery = true, "select template.* from plan_granted_template granted join license license on granted.fk_plan = license.fk_plan join message_template template on granted.fk_message_template = template.id where license.fk_garage = ?2 and template.message_type = ?1")
public List<MessageTemplate> findGrantedTemplatesByMessageTypeAndGarage(MessageType messageType, Garage garage);
}
车库有一个许可证
许可证有一个计划和车库
该计划有许多MessageTemplate
类许可与Plan和OneToOne关系与车库
具有ManyToOne关系
(表格许可证 - 列fk_plan和fk_garage)
类Plan与MessageTemplate具有ManyToMany关系 (table plan_granted_template - columns fk_plan和fk_message_template)
MessageTemplate类具有属性messageType
(表message_template - 列message_type)
此方法应返回在查询中找到的所有MessageTemplate实体,但始终返回空列表。 在mysql中执行此查询将返回正确的结果。 同时查看 Hibernate 日志,查询将使用正确的参数执行,但无论如何都会返回一个空列表。
我认为Spring执行查询但是无法将resultSet转换为MessageTemplate实例。
答案 0 :(得分:1)
您需要将参数传递为String和Integer。 Hibernate以这种方式记录两种情况:[BasicBinder:83]:绑定参数[1]为[INTEGER] - 1 [BasicBinder:83]:绑定参数[2]为[VARCHAR] - 欢迎。
不确定你的参数MessageTemplate messageTemplate是否能很好地与template.message_type =?1,你试过传递String messageTemplate,我的意思是在查询中需要的messageTemplate和String之间进行转换,尝试添加DEBUG来查看参数send到数据库
<强>更新强> 并且方法中的结束参数应该是string和int,而不是Classes。