2017-11-22 220 views
0

Google 또는 스택에서이 문제가 매우 이상하게 보입니다. 설명하겠습니다.XML ResultMap MyBatis with association

내 인터페이스 메소드의 주석에 결과 맵이 있습니다. 이 특별한 경우에만 동적 쿼리가 필요합니다. 그래서 XML 파일의 인터페이스에 대한 전체 매퍼를 작성하기로 결정한 것입니다. 아래 전체 파일을 붙여 넣습니다. 선택 쿼리는 정상적으로 수행되어야하지만 <resultMap>과 관련된 몇 가지 어려움이 있습니다.

다른 웹 사이트에서는 일대일, 일대 다, 다 대다 관계 및이 결과 맵의 일반적 구성에 대한 좋은 설명을 찾고있었습니다.

하위 쿼리, 하위 결과 맵에이를 처리 할 수있는 가능성이 있음을 알았습니다. 하지만 이미 myBatis 주석을 사용 했으므로이를 사용하고 싶습니다. 나를지도 해 주실 수 있습니다. 어떻게 결과 맵을 구성해야합니까? 나는 생성자 판별에 필요한 참조 해달라고,하지만 여전히 소리입니다 ... (내가 <collection> 마크를 추가 한 이유입니다) - 인 IntelliJ 말 전체 <resultMap>을 강조한다 : "The content of element type "resultMap" must match "(constructor?,id*,result*,association*,collection*,discriminator?)"

나는 그것이 명백한 것 알고 있지만, 나는 completly이 그것을 올바르게하는 방법을 모른다. 도와주세요.

XML 매퍼 파일 :

<association> 당신이 그룹에 필요 <result> 태그와 의미, 모든 <result> 태그 뒤에 와야합니다 :

<?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="pl.net.manager.dao.UsageCounterDAO"> 
    <select id="getUsageCounterList" resultType="pl.net.manager.domain.UsageCounter" 
      resultMap="getUsageCounterListMap"> 
     SELECT * FROM usage_counter WHERE 
     <if test="apiConsumerIdsList != null"> 
      api_consumer IN 
      <foreach item="item" index="index" collection="apiConsumerIdsList" 
        open="(" separator="," close=")"> 
       #{item} 
      </foreach> 
      AND 
     </if> 
     <if test="serviceConsumerIdsList != null"> 
      service IN 
      <foreach item="item" index="index" collection="serviceConsumerIdsList" 
        open="(" separator="," close=")"> 
       #{item} 
      </foreach> 
      AND 
     </if> 
     <if test="dateFrom != null"> 
      date &gt;= #{dateFrom} AND 
     </if> 
     <if test="dateTo != null"> 
      date &lt;= #{dateTo} AND 
     </if> 
     <if test="status != null"> 
      status = #{status} 
     </if> 
    </select> 
    <resultMap id="getUsageCounterListMap" type=""> 

        ofType="pl.net.manager.domain.UsageCounter"> 
      <id property="id" column="id"/> 
      <result property="date" column="date"/> 
      <result property="apiConsumer" column="api_consumer" 
        javaType="pl.net.manager.domain.ApiConsumer"/> 
      <association property="apiConsumer" column="api_consumer" 
         resultMap="pl.net.manager.dao.ApiConsumerDAO.getApiConsumer"/> 
      <result property="service" column="service" javaType="pl.net.manager.domain.Service"/> 
     <association property="service" column="service" 
        resultMap="pl.net.manager.dao.ServiceDAO.getService"/> 

      <result property="counterStatus" column="counter_status"/> 
      <result property="ratingProcessId" column="rating_process_id"/> 
      <result property="value" column="value"/> 
      <result property="createdDate" column="created_date"/> 
      <result property="modifiedDate" column="modified_date"/> 

    </resultMap> 
</mapper> 
+0

은'는'당신이 태그''그룹에 필요하고 – MohamedSanaulla

답변

1

매퍼 XML에 대한 XSD는 <resultMap> A의 것으로 기대 그 후에 <association> 태그를 추가하십시오.

두 번째로 에는 resultTyperesultMap이 필요하지 않습니다. 귀하의 경우에 맞는 것을 사용하십시오. resultMap

세 번째로 getUsageCounterListWHERE 절이 깨졌습니다. 내가 쿼리에 내 이전 답변에서 언급 한대로 <where> 태그를 사용하고 그 대답에 언급 된 구문을 수행 할 수 있습니다

SELECT * FROM usage_counter WHERE api_consumer IN (1,2,3) AND 

: 만 첫 번째 조건이 충족되는 경우, 그 경우에 대비하여 SELECT 같은 것을 할 것이다 무엇 .

넷째는 resultMapgetUsageCounterListMap에서 당신은 당신의 자바 클래스는 채울하려고하는 것입니다 type 필요, 그래서 당신은 typeofType를 이동할 수 있습니다. 아래로

일대일 매핑를 들어, 그냥 <association> 태그를 사용하거나 다른 방법이있다, 당신은 자바 POJO에 있다고 가정합니다

public class Country{ 
    private String name; 
    private City capital; 
    //getters and setters 
} 
public class City{ 
    private String name; 
    //getters and setters 
} 

당신은 XML로 매핑을 쓸 수 있습니다 아래 :

<select id="getCountries" resultType="Country"> 
    SELECT c.name, cy.name "capital.name" 
    FROM country c 
    JOIN city cy ON cy.name = c.capital 
</select> 

그래서 MyBatis로는 City의 인스턴스를 만들고 해당 인스턴스의 name 속성에 capital.name의 값을 할당해야 할 것입니다.

1 대 다수 또는 많음 많음 매핑을 사용하면 MyBatis 결과 맵의 <collection> 태그를 탐색 할 수 있습니다. 자세한 내용은 제공된 링크의 Advacned Result Maps 섹션을 참조하십시오.

+0

당신에게 너무 감사 한 후 다음''태그를 추가 의미하는 모든''태그 뒤에 와야합니다! 나는 곧바로 앉아서 모두 시험해 볼 것이다! – xross

+0

태그를 일대일로 사용하려면 속성, 열 및 resultMap에 필드의 값을 입력해야합니까? (어떻게 내부에 메소드를 삽입해야합니까?) Webside - 고급 결과 맵을 보았지만 정확히 완료되지 않았 음을 알았습니다. – xross

+0

예를 들면 다음과 같습니다 : org.mybatis.spring.MyBatisSystemException : 중첩 예외는 org.apache.ibatis.exceptions.PersistenceException : ### 데이터베이스를 쿼리하는 중 오류입니다. 원인 : java.lang.IllegalArgumentException : Result지도 컬렉션에 pl.net.manager.dao.RateplanDAO 값이 없습니다. – xross