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

发布于 2025-01-17 07:40:01 字数 728 浏览 3 评论 0 原文

我收到以下错误:

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 不同。

有什么想法吗?

I get following error:

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

But my code points to the type I intent to receive:

@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;
    }
}

Info: The objects Event and EventDTO are different.

Any Idea?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

单身情人 2025-01-24 07:40:01

Query query =EntityManager.createQuery(sql, Event.class); <---- 这里你通知库它必须使用Event.class解析结果

但是这里 List resultList = (List) query.getResultList(); 您尝试使用 EventDTO.class 解析结果

将其更改为
列表<事件> resultList = query.getResultList();

然后使用一些转换器将 List 转换为 List

Query query = entityManager.createQuery(sql, Event.class); <---- Here you inform the library that it must parse the result using Event.class

But here List<EventDTO> resultList = (List<EventDTO>) query.getResultList(); you try to parse the result using EventDTO.class

Change it into
List<Event> resultList = query.getResultList();

and then use some converter to convert the List<Event> into a List<EventDTO>

迷爱 2025-01-24 07:40:01

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

java.lang.IllegalArgumentException 的原因

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

一旦您清楚了问题,请参考 @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;
    }
}

Before fixing your code you must be clear about the reasons for java.lang.IllegalArgumentException. Refer

Reasons for java.lang.IllegalArgumentException

  • When Arguments out of range. For example, the percentage should lie between 1 to 100. If the user entered 101 then an IllegalArugmentExcpetion will be thrown.
  • When argument format is invalid. For example, if our method requires date format like YYYY/MM/DD but if the user is passing YYYY-MM-DD. Then our method can’t understand then IllegalArugmentExcpetion will be thrown.
  • When a method needs non-empty string as a parameter but the null string is passed.

Once you are clear about the issues, please refer to the solution which was already provided by @Panagiotis Bougioukas

Issue - Argument format is invalid

Most probably below solution should work(Not tested)

@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;
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文