IllegalArgumentException:请求的结果类型不匹配 - 但类型已设置

IllegalArgumentException: Mismatch in requested result type - but Type is set

我收到以下错误:

IllegalArgumentException: Mismatch in requested result type [com.taqwaapps.entity.Event] and actual result type [com.taqwaapps.dto.EventDTO]

但我的代码指向我打算接收的类型:

@Repository
public class EventRepositoryImpl  {

    @PersistenceContext
    private EntityManager entityManager;

    public List<EventDTO> getLatestEventsFiltered(String sql, int limit) {
        Query query = entityManager.createQuery(sql, Event.class);
        query.setMaxResults(limit);

        List<EventDTO> resultList = (List<EventDTO>) query.getResultList();
        return resultList;
    }
}

信息:对象 EventEventDTO 不同。

有什么想法吗?

Query query = entityManager.createQuery(sql, Event.class); <---- 在这里您通知库它必须使用 Event.class

解析结果

但是这里 List<EventDTO> resultList = (List<EventDTO>) query.getResultList(); 您尝试使用 EventDTO.class

来解析结果

改成 List<Event> resultList = query.getResultList();

然后使用一些转换器将 List<Event> 转换为 List<EventDTO>

在修复代码之前,您必须清楚 java.lang.IllegalArgumentException 的原因。 Refer

java.lang.IllegalArgumentException

的原因
  • 当参数超出范围时。例如,百分比应介于 1 到 100 之间。如果用户输入 101,则会抛出 IllegalArugmentExcpetion。
  • 当参数格式无效时。例如,如果我们的方法需要像 YYYY/MM/DD 这样的日期格式,但如果用户传递的是 YYYY-MM-DD。那么我们的方法无法理解就会抛出IllegalArugmentExcpetion
  • 当方法需要 non-empty 字符串作为参数但传递的是空字符串时。

弄清楚问题后,请参考@Panagiotis Bougioukas

已经提供的解决方案

问题 - 参数格式无效

很可能下面的解决方案应该有效(未测试)

@Repository
public class EventRepositoryImpl {

    @PersistenceContext
    private EntityManager entityManager;

    public List<EventDTO> getLatestEventsFiltered(String sql, int limit) {

        var query = entityManager.createQuery(sql, Event.class);
        query.setMaxResults(limit);
        var resultList = query.getResultList().
                 stream().map(this::convertToDto).
                    collect(Collectors.toList());

        return resultList;
    }

    private EventDTO convertToDto(Event event) {
        var dto = new EventDTO();
        // convert event to eventdto here
        return dto;
    }
}