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;
}
}
信息:对象 Event
和 EventDTO
不同。
有什么想法吗?
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;
}
}
我收到以下错误:
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;
}
}
信息:对象 Event
和 EventDTO
不同。
有什么想法吗?
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;
}
}