【问题标题】:Spring Data JPA - Native query on crud repositories works with joins?Spring Data JPA - 对 crud 存储库的本机查询与连接一起使用?
【发布时间】: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


【解决方案1】:

您需要将参数作为字符串和整数传递。 Hibernate 在两种情况下都以这种方式记录:[BasicBinder:83]: binding parameter [1] as [INTEGER] - 1 [BasicBinder:83]: binding parameter [2] as [VARCHAR] - WELCOME。

不确定你的参数MessageTemplate messageTemplate是否与template.message_type = ?1配合得很好,你是否尝试过传递String messageTemplate,我的意思是在查询中需要的messageTemplate和String之间的转换,尝试添加DEBUG以查看参数发送到数据库

更新 并且方法中的结束参数应该是string和int,而不是Classes。

【讨论】:

    猜你喜欢
    • 2021-04-06
    • 1970-01-01
    • 2017-04-21
    • 1970-01-01
    • 2015-03-28
    • 2016-12-10
    • 2021-04-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多