米巴蒂斯。java.lang.UnsupportedOperationException

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/16534205/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-31 23:14:50  来源:igfitidea点击:

mybatis. java.lang.UnsupportedOperationException

javamybatis

提问by GoodwillDD

Why an error occurs in this code? I don't understand.. Help me please.

为什么这段代码会出错?我不明白。。请帮帮我。

I've tested it: doSave(), getListCount(), doDelete(), getDetails()are good.

我测试过它:doSave()getListCount()doDelete()getDetails()都不错。

But, in getList()method an error occurs!

但是,在getList()方法中发生错误!

Why? That method has no parameters, only one query.

为什么?该方法没有参数,只有一个查询。

select * from tb_board_data

my config : mybatis 3.2.2 / mybatis-spring 1.2.0 / spring 3.2.2

我的配置:mybatis 3.2.2 / mybatis-spring 1.2.0 / spring 3.2.2

package kr.co.goodwilldd.board.mapper;

import java.util.ArrayList;

import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.SelectKey;
import org.apache.ibatis.mapping.StatementType;
import org.springframework.stereotype.Repository;

@Repository
public interface CommonBoardMapper<T> {

    @Select(value = "SELECT COUNT(*) FROM TB_BOARD_DATA")
    public long getListCount();

    @Select(value = "SELECT * FROM TB_BOARD_DATA")
    public ArrayList<T> getList();

    @Select(value = "SELECT * FROM TB_BOARD_DATA WHERE bseq = #{_seq}")
    public T getDetails(long _seq);

    @SelectKey(before=true, keyProperty="bseq", statementType=StatementType.PREPARED, statement="SELECT (IFNULL(MAX(BSEQ),0)+1) as bseq FROM TB_BOARD_DATA", resultType=Long.class)
    @Insert(value = "INSERT INTO TB_BOARD_DATA(bseq, boardName, register, subject, content, reStep, reLevel, regdate) SELECT #{bseq}, #{boardName}, #{register}, #{subject}, #{content}, ifnull(((floor(max(reStep)/100))+1)*100+99, 199) , 0, CURRENT_DATE() FROM TB_BOARD_DATA")
    public int doSave(T t);

    @Delete(value = "DELETE FROM TB_BOARD_DATA WHERE bseq = #{_seq}")
    public int doDelete(long _seq);
}

Error logs here:

错误日志在这里:

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: java.lang.UnsupportedOperationException
### The error may exist in kr/co/goodwilldd/board/mapper/CommonBoardMapper.java (best guess)
### The error may involve defaultParameterMap
### The error occurred while setting parameters
### SQL: SELECT * FROM TB_BOARD_DATA
### Cause: java.lang.UnsupportedOperationException
    at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:73)
    at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:364)
    at com.sun.proxy.$Proxy13.selectList(Unknown Source)
    at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:194)
    at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:114)
    at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:58)
    at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:43)
    at com.sun.proxy.$Proxy25.getList(Unknown Source)
    at kr.co.goodwilldd.board.CommonBoardTest.getListByMapper(CommonBoardTest.java:31)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.junit.runners.model.FrameworkMethod.runReflectiveCall(FrameworkMethod.java:44)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
    at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74)
    at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:83)
    at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:88)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:193)
    at org.junit.runners.ParentRunner.schedule(ParentRunner.java:52)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
    at org.junit.runners.ParentRunner.access
List<Customer> getList();
0(ParentRunner.java:42) at org.junit.runners.ParentRunner.evaluate(ParentRunner.java:184) at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71) at org.junit.runners.ParentRunner.run(ParentRunner.java:236) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) Caused by: org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause: java.lang.UnsupportedOperationException ### The error may exist in kr/co/goodwilldd/board/mapper/CommonBoardMapper.java (best guess) ### The error may involve defaultParameterMap ### The error occurred while setting parameters ### SQL: SELECT * FROM TB_BOARD_DATA ### Cause: java.lang.UnsupportedOperationException at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:23) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:107) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:98) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:354) ... 36 more Caused by: java.lang.UnsupportedOperationException at org.apache.ibatis.reflection.wrapper.CollectionWrapper.findProperty(CollectionWrapper.java:42) at org.apache.ibatis.reflection.MetaObject.findProperty(MetaObject.java:76) at org.apache.ibatis.executor.resultset.FastResultSetHandler.applyAutomaticMappings(FastResultSetHandler.java:342) at org.apache.ibatis.executor.resultset.FastResultSetHandler.getRowValue(FastResultSetHandler.java:267) at org.apache.ibatis.executor.resultset.FastResultSetHandler.handleRowValues(FastResultSetHandler.java:216) at org.apache.ibatis.executor.resultset.FastResultSetHandler.handleResultSet(FastResultSetHandler.java:188) at org.apache.ibatis.executor.resultset.FastResultSetHandler.handleResultSets(FastResultSetHandler.java:154) at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:57) at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:70) at org.apache.ibatis.executor.ReuseExecutor.doQuery(ReuseExecutor.java:54) at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:259) at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:132) at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:105) at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:81) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:104) ... 42 more

回答by duanjfeng

You should specify a concrete type as the return type, like

您应该指定一个具体类型作为返回类型,例如

List<T> getList();

, but no generic type

, 但没有泛型类型

List getList();

or

或者

@Select(value = "SELECT * FROM TB_BOARD_DATA")
public List<T> getList();

Cause if you specify the type, mybatis will use BeanWrapper convert each row to the type. But if there are no specific type, mybatis will treat each row as a List and use CollectionWrapper, which findProperty is not supported.

因为如果指定类型,mybatis 会使用 BeanWrapper 将每一行转换为类型。但是如果没有特定的类型,mybatis 会把每一行当成一个List,使用CollectionWrapper,不支持findProperty。

回答by user3262100

try this:

试试这个:

@Select(value = "SELECT * FROM TB_BOARD_DATA")
public List<T> getList();

回答by Om.

Always follow code for interface :)

始终遵循接口代码:)

Either use Generic

要么使用通用

 @Select(value = "SELECT * FROM TB_BOARD_DATA")
   public List<String> getList();

Or Non Generic

或非通用

getList(Unknown Source)

回答by Mukesh

If you see the OOPS design principles which says that always "Programming for Interface not implementation" .We should follow that practice it will avoid many undesired exceptions.

如果您看到 OOPS 设计原则,它总是说“为接口编程而不是实现”。我们应该遵循这种做法,它将避免许多不需要的异常。

回答by javalearner_heaven

Your error is

你的错误是

##代码##

Please provide the same return type while calling the method also. Listmeans List or ArrayListmeans ArrayList

请在调用该方法时也提供相同的返回类型。 List表示 List 或ArrayList表示 ArrayList

回答by Gangnus

I had the same error when:

我在以下情况下遇到了同样的错误:

  1. In the XML mapper the Oracle expression got Stringvalue as CHAR(table.coltime, 'DD.MM.YYYY')
  2. My return type got java.sql.Dateinstead.
  1. 在 XML 映射器中,Oracle 表达式的String值为CHAR(table.coltime, 'DD.MM.YYYY')
  2. 我的返回类型java.sql.Date改为。

The repair removed the error.

修复消除了错误。

So, the error can appear as a result of unfitting field types in the return object.

因此,错误可能是由于返回对象中的字段类型不合适而出现的