【问题标题】:Spring Data JPA: native summary gets ConverterNotFoundExceptionSpring Data JPA:本机摘要获取 ConverterNotFoundException
【发布时间】:2019-12-18 21:01:45
【问题描述】:

更新

我已将第一个方法更改为返回 List,但我得到了同样的异常。

我的 Repository 类中有 2 个本机查询。键入一个以返回所有记录,另一个仅返回一行。见下文:

@Query(nativeQuery = true, value = NATIVE_SUMMARY_QUERY_PARTIAL + "group by (rjd.refresh_job_identifier)) as rc")
List<RefreshSummary> getRefreshJobDetailSummary();

@Query(nativeQuery = true, value = NATIVE_SUMMARY_QUERY_PARTIAL + " WHERE rjd.refresh_job_identifier = :refreshJobId" +
        " group by (rjd.refresh_job_identifier)) as rc")
List<RefreshSummary> getRefreshJobDetailSummaryById(@Param("refreshJobId") String refreshJobId);

interface RefreshSummary {
    String getRefreshJobId();
    Date getRefreshJobStart();
    Date getRefreshJobComplete();
    String getUserId();
    long getTotalRecords();
    long getSuccessfulRecords();
    long getPendingRecords();
    long getErrorRecords();
    long getCancelledRecords();
    String getRefreshJobStatus();
}

String NATIVE_SUMMARY_QUERY_PARTIAL = "SELECT  rc.refresh_job_identifier as refresh_job_id, ..."

第一种方法getRefreshJobDetailSummary 工作正常。但是第二种方法,我只想要一行,给了我这个例外:

org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type [java.lang.String] to type [com.company.repository.RefreshJobDetailRepository$RefreshSummary]

完整的查询如下所示:

String NATIVE_SUMMARY_QUERY_PARTIAL = "SELECT  rc.refresh_job_identifier as refresh_job_id, " +
        "rc.refresh_job_start_time as refresh_job_start, " +
        "rc.record_completion_time as refresh_job_complete, " +
        "rc.user_id as user_id, " +
        "rc.pending + rc.successful + rc.cancelled + rc.error as total_records, " +
        "rc.successful as successful_records, " +
        "rc.pending as pending_records, " +
        "rc.error as error_records, " +
        "rc.cancelled as cancelled_records, " +
        "CASE WHEN pending > 0 THEN 'In progress' " +
        "ELSE 'Complete' " +
        "END as refresh_job_status " +
        "FROM " +
        "(SELECT rjd.refresh_job_identifier as refresh_job_identifier, " +
        "MAX(rjd.refresh_job_start_time) as refresh_job_start_time, " +
        "MAX(rjd.record_completion_time) as record_completion_time, " +
        "MAX(rjd.org_usr_nu) as user_id, " +
        "SUM(CASE WHEN LOWER(record_status) = 'pending' THEN 1 ELSE 0 END) as pending, " +
        "SUM(CASE WHEN LOWER(record_status) = 'successful' THEN 1 ELSE 0 END) as successful, " +
        "SUM(CASE WHEN LOWER(record_status) = 'cancelled' THEN 1 ELSE 0 END) as cancelled, " +
        "SUM(CASE WHEN LOWER(record_status) = 'error' THEN 1 ELSE 0 END) as error " +
        "from erd_cfg_owner.refresh_job_detail rjd " ;

查询返回的值如下所示:

'{20191218204913458hc35, 2019-12-18 20:49:13.314, 2019-12-18 20:49:24.335, hc35, 1, 1, 0, 0, 0, Complete}'

有人可以对此有所了解吗?为什么一种方法有效,而另一种无效?

【问题讨论】:

  • 能否提供NATIVE_SUMMARY_QUERY_PARTIAL的完整值?
  • @Sternk,当然,我会编辑我的问题。
  • 首先尝试获取字符串而不是对象。然后你可以比较结果
  • @IharSadounikau,我不知道为什么我没想到!它绝对返回一个字符串。我更喜欢界面,但我不想要对象映射器的费用。你能想像我真正想要的那样投射界面吗?否则,我将只使用字符串...
  • 接口作为对象,我没注意到。我想hibernate不知道映射属性的方法。尝试使用经典类或抽象类(不确定 AC 会给出不同的结果)

标签: java hibernate jpa spring-data-jpa


【解决方案1】:

我会将您的第二个方法的返回类型从RefreshSummary 替换为List&lt;RefreshSummary&gt;。从理论上讲,您的方法应该返回一个列表而不是单个值

【讨论】:

    【解决方案2】:

    您能否尝试在查询声明中使用构造函数表达式或创建自定义转换器。

    Eg-SELECT NEW com.example.MyClass(e.attribute1, e.attribute2...) FROM MyEntity e");
    

    【讨论】:

    • 但是 RefreshSummary 是一个接口——我不能使用new。而且我不确定如何实现转换器。你能给我举个例子吗?
    猜你喜欢
    • 2018-09-05
    • 2018-09-26
    • 2013-03-07
    • 1970-01-01
    • 2019-11-18
    • 2019-04-15
    • 2018-08-06
    • 2016-09-30
    • 2020-03-11
    相关资源
    最近更新 更多