Spring Data JPA - 关于crud存储库的本机查询适用于连接?

时间:2014-02-07 17:57:10

标签: mysql spring hibernate spring-data-jpa

我有一个扩展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实例。

1 个答案:

答案 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。