【发布时间】:2014-02-07 17:57:10
【问题描述】:
我有一个扩展 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
License 类与 Plan 具有 ManyToOne 关系,与 Garage 具有 OneToOne 关系
(表格许可证 - 列 fk_plan 和 fk_garage)
Plan 类与 MessageTemplate 具有多对多关系
(表 plan_granted_template - 列 fk_plan 和 fk_message_template)
类 MessageTemplate 具有属性 messageType
(table message_template - column message_type)
此方法应返回在查询中找到的所有 MessageTemplate 实体,但始终返回一个空列表。 在 mysql 中执行此查询会返回正确的结果。 还要查看 Hibernate 日志,使用正确的参数执行查询,但无论如何都会返回一个空列表。
我认为 Spring 执行了查询,但未能将 resultSet 转换为 MessageTemplate 实例。
【问题讨论】:
-
为什么你不使用 JPQL 代替原生,你的实体映射了吗?
-
是的,我已经映射了实体。我在使用 jpql 时遇到了困难,但是在 mysql 中执行的这个查询正确地返回了结果 =(
-
不确定你的参数MessageTemplate messageTemplate是否与template.message_type = ?1一起玩,你是否尝试过传递String messageTemplate,我的意思是在查询中需要messageTemplate和String之间的转换,尝试添加DEBUG查看发送到数据库的参数
-
在 Hibernate 日志中,我看到转换的参数。 Garage参数转换为ID,messageType转换为String。
-
@Koitoer,你是对的!我需要将参数作为字符串和整数传递。 Hibernate 在两种情况下都以这种方式记录:[BasicBinder:83]: binding parameter [1] as [INTEGER] - 1 [BasicBinder:83]: binding parameter [2] as [VARCHAR] - WELCOME
标签: mysql spring hibernate spring-data-jpa