java.lang.IllegalArgumentException: Cannot mix JPA positional parameters and native Hibernate positi

Caused by: java.lang.IllegalArgumentException: Cannot mix JPA positional parameters and native Hibernate positional/ordinal parameters
	at org.hibernate.jpa.internal.QueryImpl.extractParameterInfo(QueryImpl.java:130)
	at org.hibernate.jpa.internal.QueryImpl.<init>(QueryImpl.java:77)
	at org.hibernate.jpa.internal.QueryImpl.<init>(QueryImpl.java:68)
	at org.hibernate.jpa.spi.AbstractEntityManagerImpl.createNativeQuery(AbstractEntityManagerImpl.java:905)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:298)
	at com.sun.proxy.$Proxy138.createNativeQuery(Unknown Source)
	at org.springframework.data.jpa.repository.query.NativeJpaQuery.createJpaQuery(NativeJpaQuery.java:68)
	at org.springframework.data.jpa.repository.query.AbstractStringBasedJpaQuery.doCreateQuery(AbstractStringBasedJpaQuery.java:79)
	at org.springframework.data.jpa.repository.query.AbstractJpaQuery.createQuery(AbstractJpaQuery.java:190)
	at org.springframework.data.jpa.repository.query.JpaQueryExecution$ModifyingExecution.doExecute(JpaQueryExecution.java:238)
	at org.springframework.data.jpa.repository.query.JpaQueryExecution.execute(JpaQueryExecution.java:85)
	at org.springframework.data.jpa.repository.query.AbstractJpaQuery.doExecute(AbstractJpaQuery.java:116)
	at org.springframework.data.jpa.repository.query.AbstractJpaQuery.execute(AbstractJpaQuery.java:106)
	at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:483)
	at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:461)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:61)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
	at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:282)
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136)
	... 39 more

错误原因:

             你的占位符有问题,如我例子中  第七个参数,  把 "7?" 改为  "?7"就可以 了

例子:

  

 @Query(value = "INSERT INTO project_scheduling_details (project_no,sort,big_name,small_name,start_time,end_time,status) VALUES (?1,?2,?3,?4,?5,?6,7?)",nativeQuery = true)
    void addSchedulingDetails(String projectNo,int sort,String bigName,String smallName,Date startTime,Date endTime,int status);

 

### 问题分析与解决方法 在 Java 编程中,`java.lang.IllegalArgumentException: invalid comparison: java.util.Date and java.lang.String` 是一种常见的运行时异常。这种异常通常发生在尝试对 `java.util.Date` 和 `java.lang.String` 类型进行比较时[^1]。具体来说,当 SQL 查询条件中包含对日期字段的字符串判断逻辑(例如 `createTime = ' '`),而实际传递的参数是 `Date` 类型时,就会引发此异常[^2]。 为了解决这一问题,需要确保在代码中正确处理类型转换,并避免直接对不同类型的对象进行比较。以下是具体的解决方案: --- ### 解决方案 #### 1. 修改 XML 或 SQL 条件逻辑 如果问题出现在 MyBatis 的 XML 配置文件中,可以通过调整 `<if>` 标签的条件逻辑来避免类型不匹配的问题。例如,将以下代码: ```xml <if test="deadline != null and deadline != ''"> deadline = #{deadline}, </if> ``` 修改为仅检查 `deadline` 是否为 `null`,而不进行字符串比较: ```xml <if test="deadline != null"> deadline = #{deadline}, </if> ``` 这样可以有效避免 `java.util.Date` 和 `java.lang.String` 的类型冲突[^3]。 --- #### 2. 确保参数类型一致性 在传递参数到 SQL 查询之前,应确保所有参数的类型一致。例如,如果数据库中的字段是 `DATE` 类型,则应该传递 `java.util.Date` 或其子类(如 `java.sql.Date`)作为参数,而不是传递字符串。 可以在代码中显式地进行类型转换,例如使用 `SimpleDateFormat` 将字符串转换为日期: ```java import java.text.SimpleDateFormat; import java.util.Date; public class DateConverter { public static Date convertToDate(String dateString) throws Exception { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); return dateFormat.parse(dateString); } } ``` 然后,在调用 SQL 查询之前,先将字符串参数转换为 `Date` 类型: ```java try { String deadlineStr = "2023-10-01"; Date deadlineDate = DateConverter.convertToDate(deadlineStr); // 将 deadlineDate 作为参数传递给 SQL 查询 } catch (Exception e) { e.printStackTrace(); } ``` --- #### 3. 使用 MyBatis 的类型处理器 MyBatis 提供了类型处理器(TypeHandler)机制,用于在 Java 对象和数据库字段之间进行类型转换。可以通过自定义类型处理器来确保 `java.util.Date` 和 `String` 之间的正确转换。 例如,定义一个自定义的类型处理器: ```java import org.apache.ibatis.type.BaseTypeHandler; import org.apache.ibatis.type.JdbcType; import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.text.SimpleDateFormat; import java.util.Date; public class DateStringTypeHandler extends BaseTypeHandler<Date> { private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd"); @Override public void setNonNullParameter(PreparedStatement ps, int i, Date parameter, JdbcType jdbcType) throws SQLException { ps.setString(i, DATE_FORMAT.format(parameter)); } @Override public Date getNullableResult(ResultSet rs, String columnName) throws SQLException { String dateStr = rs.getString(columnName); return dateStr == null ? null : parseDate(dateStr); } @Override public Date getNullableResult(ResultSet rs, int columnIndex) throws SQLException { String dateStr = rs.getString(columnIndex); return dateStr == null ? null : parseDate(dateStr); } @Override public Date getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { String dateStr = cs.getString(columnIndex); return dateStr == null ? null : parseDate(dateStr); } private Date parseDate(String dateStr) { try { return DATE_FORMAT.parse(dateStr); } catch (Exception e) { throw new RuntimeException("Failed to parse date string: " + dateStr, e); } } } ``` 接着,在 MyBatis 的配置文件中注册该类型处理器: ```xml <typeHandlers> <typeHandler handler="com.example.DateStringTypeHandler" javaType="java.util.Date" jdbcType="VARCHAR"/> </typeHandlers> ``` --- ### 总结 通过上述方法,可以有效解决 `java.lang.IllegalArgumentException: invalid comparison: java.util.Date and java.lang.String` 的问题。核心在于确保参数类型的一致性,并避免在代码或 SQL 中直接对不同类型的对象进行比较。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值