Spring Data JPA - 在crud仓库上使用本地查询是否支持联接操作?

3

我有一个接口,它扩展了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);
}

车库(Garage)有一个许可证(License)
许可证(License)有一个计划(Plan)和车库(Garage)
计划(Plan)有多个消息模板(MessageTemplate)

许可证(License)类与计划(Plan)类具有ManyToOne关系,与车库(Garage)类具有OneToOne关系
(表license-列fk_plan和fk_garage)

计划(Plan)类与消息模板(MessageTemplate)类具有ManyToMany关系
(表plan_granted_template-列fk_plan和fk_message_template)

消息模板(MessageTemplate)类具有属性messageType
(表message_template-列message_type)

该方法应返回查询中找到的所有MessageTemplate实体,但始终返回空列表。 在mysql中执行此查询将返回正确的结果。 同时查看Hibernate日志,可以发现查询使用了正确的参数执行,但仍然返回一个空列表。

我认为Spring执行了查询,但无法将resultSet转换为MessageTemplate实例。


为什么你不使用JPQL而是使用本地查询,你的实体是否已经映射? - Koitoer
是的,我已经映射了实体。我在 JPQL 方面遇到了困难,但是这个查询在 MySQL 中执行返回了正确的结果 =( - Sandro Simas
不确定你的参数MessageTemplate messageTemplate是否与template.message_type = ?1兼容,你尝试传递String messageTemplate了吗?我是说在查询中需要在messageTemplate和String之间进行转换,尝试添加DEBUG以查看发送到数据库的参数。 - Koitoer
1
@Koitoer,你是对的!我需要将参数传递为字符串和整数。Hibernate在这两种情况下都会记录日志: [BasicBinder:83]: binding parameter [1] as [INTEGER] - 1 [BasicBinder:83]: binding parameter [2] as [VARCHAR] - WELCOME - Sandro Simas
请将我的答案标记为正确,这将是很棒的。 - Koitoer
显示剩余3条评论
1个回答

1
你需要将参数作为字符串和整数传递。无论是哪种情况,Hibernate都会以这种方式记录日志:[BasicBinder:83]:绑定参数[1]作为[INTEGER] - 1 [BasicBinder:83]:绑定参数[2]作为[VARCHAR] - WELCOME。
不确定你的参数MessageTemplate messageTemplate是否与template.message_type = ?1匹配,你尝试过传递String messageTemplate吗?我的意思是,在查询中需要在messageTemplate和String之间进行转换,尝试添加DEBUG以查看发送到数据库的参数。
更新 方法中的最终参数应该是字符串和整数,而不是类。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接