【问题标题】:IllegalArgumentException: argument type mismatch in Hibernate while using AliasToBeanResultTransformer and MySQL UNION SQLQueryIllegalArgumentException:在使用 AliasToBeanResultTransformer 和 MySQL UNION SQLQuery 时,Hibernate 中的参数类型不匹配
【发布时间】:2018-06-14 23:37:06
【问题描述】:

我在 Hibernate 中使用 AliasToBeanResultTransformer 进行以下查询,它有效
SQL Query 1

//Query 1
final String GET_ASSIGNMENT_STATUS = 
    "select distinct wtd.work_task_detail_id as workTaskDetailId, wtd.assigned_task as assignedTask, "
    + "e.emp_id as employeeId, concat( e.first_name,' ',e.last_name ) as employeeName, "
    + "wtd.deadline_date as deadlineDate, a.code_name as workTaskStatusName, a.code_id as workTaskStatusId, "
    + "wtd.completion_date as completionDate, wtd.priority as priority "
    + "from work_task_detail wtd "
    + "join allcode a on a.code_id = wtd.work_task_status "
    + "join employee e on e.emp_id = wtd.team_member_id  "
    + "where wtd.work_task_detail_id = :assignmentId";

如果我在 MySQL union 查询中使用相同的选择标准,它会给我异常 IllegalArgumentException: argument type mismatch

SQL 查询 2

//Query 2           
final String GET_ASSIGNMENT_STATUS = 
    "select distinct wtd.work_task_detail_id as workTaskDetailId, wtd.assigned_task as assignedTask, "
    + "e.emp_id as employeeId, concat( e.first_name,' ',e.last_name ) as employeeName, "
    + "wtd.deadline_date as deadlineDate, a.code_name as workTaskStatusName, a.code_id as workTaskStatusId, "
    + "wtd.completion_date as completionDate, wtd.priority as priority "
    + "from work_task_detail wtd "
    + "join logs l on wtd.work_task_detail_id = l.tran_id and l.transaction='ASGNMT' "
    + "join user u on u.user_id = l.user_id "
    + "join employee e on e.emp_id = u.emp_id "
    + "join allcode a on a.code_id = wtd.work_task_status "
    + "where wtd.work_task_detail_id = :assignmentId and l.user_id = :userId "
    + "union "
    + "select distinct wtd.work_task_detail_id as workTaskDetailId, wtd.assigned_task as assignedTask, "
    + "e.emp_id as employeeId, concat( e.first_name,' ',e.last_name ) as employeeName, "
    + "wtd.deadline_date as deadlineDate, a.code_name as workTaskStatusName, a.code_id as workTaskStatusId, "
    + "wtd.completion_date as completionDate, wtd.priority as priority "
    + "from work_task_detail wtd "
    + "join allcode a on a.code_id = wtd.work_task_status "
    + "join employee e on e.emp_id = wtd.team_member_id  "
    + "where wtd.work_task_detail_id = :assignmentId and wtd.team_member_id = ( select emp_id from user uu where uu.user_id = :userId )";

为什么使用 UNION 会导致以下异常?
LOG

05-01-2018 12:14:57 320 org.hibernate.property.access.spi.SetterMethodImpl.set(SetterMethodImpl.java:97) 
 HHH000123: IllegalArgumentException in class: support.dto.AssignmentStatus, setter method of property: priority 
 05-01-2018 12:14:57 324 org.hibernate.property.access.spi.SetterMethodImpl.set(SetterMethodImpl.java:98) 
 HHH000091: Expected type: boolean, actual value: java.lang.Byte 

另一个

05-01-2018 12:14:57 342 support.DAO.ImplDeveloperDAO.getAssignmentStatus(ImplDeveloperDAO.java:1916) 
 Message     :- IllegalArgumentException occurred while calling setter for property [support.dto.AssignmentStatus.priority (expected type = boolean)]; target = [support.dto.AssignmentStatus@11643c8], property value = [0] setter of support.dto.AssignmentStatus.priority 
 05-01-2018 12:14:57 345 support.DAO.ImplDeveloperDAO.getAssignmentStatus(ImplDeveloperDAO.java:1917) 
 Root Cause  :- java.lang.IllegalArgumentException: argument type mismatch 
 05-01-2018 12:14:57 346 support.DAO.ImplDeveloperDAO.getAssignmentStatus(ImplDeveloperDAO.java:1918) 
              ************************************************************ 

到目前为止我尝试了什么

  1. 我在选择标准中使用了 if( wtd.priority = 0, FALSE, TRUE )
  2. 我还为priority 尝试了另外两个重载设置器,一个参数为byte,另一个参数为BigInteger

【问题讨论】:

  • 我可以看到这两个查询几乎没有区别,例如您在第二个查询中使用 userId 参数,而联合的一侧正在使用子查询。由于查询结构存在这些差异,我们不能说它只是由于联合。您检查过这些差异吗?
  • 我知道这些差异,我会再次检查并告诉你

标签: java mysql hibernate


【解决方案1】:

我提到this answer 仍然遇到问题,有建议
Expected type: boolean, actual value: java.lang.String

所以我为我的字段 priority 重载了一个 setter 方法,接受 String 作为参数。现在它按预期工作了。

public void setPriority(String priority) {
    this.priority = "true".equals(priority);
}

谢谢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-04
    • 1970-01-01
    • 2018-08-17
    • 2016-07-13
    • 1970-01-01
    • 2023-01-30
    • 2018-02-20
    • 1970-01-01
    相关资源
    最近更新 更多