2011-06-14 1 views
2

내 질문과 관련하여 설명서에서 내용을 볼 수 없었습니다. 배포시 응용 프로그램이 제대로 작동하지 않습니다 (그 이상은 초 단위 임). 나는 MyBatis에서MyBatis의 매개 변수를 통해 FROM 절 설정

<select id="getLookupRows" parameterType="map" resultMap="lookupMap"> 
    select id, name, active, valid 
    from #{table} 
</select> 

과 같은 것을하려고 노력하고 있습니다. 공유 열이있는 조회 테이블이 여러 개 있으므로보기 수준의 사용자가 궁극적으로 사용되는 조회 테이블을 결정합니다. 내가 getLookupRows을 실행하려고 할 때 내가 오류는 다음과 같이

Cause: org.apache.ibatis.executor.ExecutorException: There was no TypeHandler found for parameter table of statement info.pureshasta.mapper.LookupMapper.getLookupRows 
org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:8) 
org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:77) 
org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:69) 
org.apache.ibatis.binding.MapperMethod.executeForList(MapperMethod.java:85) 
org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:65) 
org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:38) 
$Proxy15.getLookupRows(Unknown Source) 
info.pureshasta.service.FieldTitleService.getLookupRows(FieldTitleService.java:33) 

내 매퍼 인터페이스입니다 :

List<Lookup> getLookupRows(@Param("specificColumn") String specificColumn, 
          @Param("table") String table); 

그래서 우리는 내가이 쿼리, 특별한 아무것도 문자열을 전달하기 위해 노력하고 있음을 알고있다. 그게 내 다음 과제이기 때문에 나는 특정한 칼럼을 가지고있다. 정말 각 룩업 테이블의 열 중 하나는 고유하므로 적절한 specificColumn을 호출해야하지만 테이블 매개 변수와 FROM 절이 작동하면 정말 행복 할 것입니다.

답변

8
<select id="getLookupRows" parameterType="map" resultMap="lookupMap"> 
    select id, name, active, valid 
    from ${table} 
</select> 

트릭을 수행합니다. 실제로 열 이름과 테이블에 대한 값을 주입 한 다음 열 값을 말하는 것과는 다른 표기법이 있습니다. where 절에 값을 주입하는 경우 # 표기법을 사용하는 것이 옳습니다.

이 쿼리의 테이블에 사용 된 값이 이스케이프되지 않으면 SQL 주입 문제가 발생할 수 있습니다. 내 유스 케이스의 경우, DB가 나를 앞서 갔고, Java 및 View 부분에 원하는 모든 작업을 수행 할 수 있지만 테이블의 기본 구조를 변경할 수는 없습니다.

스택 추적을 더 자세히 설명하고 싶다면 (즉, 어떤 유형의 myBatis 생각 테이블 이냐면) 나는 읽고 읽고 교육하기를 원할 것입니다.

+1

1 개의 설명을 추가하고 싶습니다. 테이블에 따라 동적 컬럼 이름 인 specificColumn을 언급했습니다. 쿼리는'select $ {specificColumn} as sc, id, name, active, valid'와 같이 쓰면 더 좋을 것입니다. 이것은 우리가 와 같은 결과 맵에서 specificColumn을 참조 할 수있게합니다.이 별칭이 없으면 resultMap의 specificColumn을 참조 할 수없는 것처럼 보입니다. – demongolem