skyflake
20
2021-04-19 17:20:25 작성 2021-04-19 17:22:00 수정됨
5
173

mybatis oracle like로 검색 하는 쿼리가 안먹힙니다




package jun.spring.prj.board1.controller;

import java.sql.SQLException;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import jun.spring.prj.board1.entity.BoardEntity;
import jun.spring.prj.board1.entity.BoardViewEntity;
import jun.spring.prj.board1.service.BoardService;
import jun.spring.prj.dto.DeptDTO;

@Controller("boardController")
@RequestMapping("/")
public class BoardController {

	@Autowired
	private BoardService service;
	
	@RequestMapping("boardList")
	public ModelAndView test() throws ClassNotFoundException, SQLException {
		List<BoardViewEntity> list = service.getList(1, "title", "tt"); // 1~10 번째 게시물, "title" 필드로 검색, "tt" 라는 제목 검색
		if(list.isEmpty()) {
			System.out.println("출력할 데이터x");
		}
		else
		{
			for (BoardViewEntity entity : list)
			{
				System.out.println("11");
				System.out.println(entity);
			}
		}
		return null;
	}
}


package jun.spring.prj.board1.service.jdbc;

import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.stereotype.Repository;

import jun.spring.prj.board1.entity.BoardEntity;
import jun.spring.prj.board1.entity.BoardViewEntity;
import jun.spring.prj.board1.service.BoardService;

@Repository
@EnableAspectJAutoProxy(proxyTargetClass = true)
public class JDBCBoardService implements BoardService {

	@Autowired
	SqlSessionTemplate sqlSessionTemplate;
	
	@Override
	public List<BoardViewEntity> getList(int page, String field, String query) throws ClassNotFoundException, SQLException {
		QueryVO qvo = new QueryVO(field, query, page);
		System.out.println(qvo.toString());
		
		return sqlSessionTemplate.selectList("getList",qvo);
	}


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

 <mapper namespace="jun.spring.prj.board1">
 	<select id="getList" resultType="BoardViewEntity" parameterType="jun.spring.prj.board1.service.jdbc.QueryVO">
 		select * from board1_view where #{field} like '%'||#{query}||'%' and num between #{start} and #{end}
 	</select>
 </mapper>




구글링해서 알아본바로는 '% %' 사용하려면 

SELECT FROM TABLE_NAME

WHERE COLUMN_NAME LIKE '%'||#searchKeyword#||'%' 

위와 같이 사용해야 하는거로 알고 있습니다.


sql developer에서는 쿼리는 정상적으로 작동하는걸 확인했습니다. 이상하게 #{query} 지울때는 데이터 전체 select다 잘 되는데 like '% 검색키워드 %' 하는 구문을 사용할때만 아무 데이터도 못읽어 오네요.

인코딩 문제인가 싶어서 오라클 인코딩도 utf8로 바꾸어 보았지만 결과는 동일했습니다.

도와주세요 ㅜㅜ




0
  • 답변 5

  • dreamerksg
    90
    2021-04-19 17:31:50

    Trim 해보세요

  • 오후
    2k
    2021-04-19 17:32:43 작성 2021-04-19 17:33:30 수정됨

    mybatis  #{}  // ${}  차이 검색해보세요.



    select * from board1_view where #{field} like '%'||#{query}||'%'
    
    >>>
    
    select * from board1_view where 'title' like '%'|| 'tt' ||'%'
  • 드코
    3k
    2021-04-19 17:59:30

    저는 이렇게 많이 씁니당

    컬럼 LIKE concat('%', #{value}, '%')

  • 쿡쿠
    684
    2021-04-19 19:28:56

    ${title}하면 되겠지만 피해야할 코딩 스타일입니다. 필드에 따라서 mybatis if 문을 쓰세요

  • skyflake
    20
    2021-04-19 20:22:21

    select * from board1_view where 

      <if test="field=='title'">

      title 

      </if>

      <if test="field=='writer'">

      writer 

      </if>

      <if test="query!=null">

      like '%'||#{query}||'%' and 

      </if>

      num between #{start} and #{end}


    # 하면 양옆에 ''가 감싸지는 것 때문에 생긴 문제인지도 모르고 자꾸 다른것에 해매었네요.

    답변해주신 모든분들 감사합니다

  • 로그인을 하시면 답변을 등록할 수 있습니다.