2017-11-22 1 views
0

Ich sehe dieses Problem sehr seltsam bei Google oder Stack beschrieben. Lassen Sie mich erklären.XML ResultMap in MyBatis mit Zuordnung

Ich habe Ergebniskarten in Anmerkungen in meiner Schnittstellenmethode. Nur in diesem speziellen Fall brauche ich eine dynamische Abfrage, und das ist der Grund, warum ich mich entschieden habe, den gesamten Mapper für die Schnittstelle in eine XML-Datei zu schreiben. Unten füge ich die ganze Datei ein. Die Select-Abfrage sollte in Ordnung sein, aber ich habe einige Schwierigkeiten mit <resultMap>.

Auf den verschiedenen Webseiten suchte ich nach einer guten Erklärung von eins zu eins, eins zu vielen, viele zu eins Zuordnung und Konstrukt dieser Ergebniskarte im Allgemeinen.

Ich sah, es gibt eine Möglichkeit, es in Unterabfragen, Subresultmaps zu teilen. Aber ich habe das schon mit myBatis Annotationen gemacht, und ich möchte es benutzen. Könnten Sie mich anweisen, wie die resultMap erstellt werden soll? Ich sehe nicht, für Konstruktor benötigen, Scheider, aber es immer noch schreit ... (das ist, warum ich <collection> Zeichen hinzugefügt) - IntelliJ unterstreicht die ganze <resultMap> sagen: "The content of element type "resultMap" must match "(constructor?,id*,result*,association*,collection*,discriminator?)"

Ich weiß, es scheint offensichtlich, aber ich habe komplett keine Ahnung wie man es richtig macht. Bitte hilf mir.

xml-Mapper-Datei:

<?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

die '' muss kommen, nachdem alle '' Tags, was bedeutet, dass Sie zum Gruppieren '' -Tags und fügen Sie dann '' Tags danach – MohamedSanaulla

Antwort

1

Die XSD für den Mapper XML erwartet, dass in einem <resultMap>:

die <association> nach allen <result>-Tags kommen muß, was bedeutet, Sie zum Gruppieren <result> Tags und dann fügen Sie <association> Tags danach hinzu.

Zweitens, Sie brauchen nicht beide und resultMap in der getUsageCounterList. Verwenden Sie eine, die in Ihrem Fall ist resultMap

Drittens ist Ihre WHERE Klausel in getUsageCounterList gebrochen. Was passiert, wenn nur die erste Bedingung erfüllt ist, dann in diesem Fall Ihre SELECT werden wie etwas sein:

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

So wie ich in meiner vorherigen Antwort auf Ihre Frage erwähnen Sie <where>-Tags verwenden, und der Syntax in dieser Antwort erwähnt folgen .

Viertens Im resultMapgetUsageCounterListMap Sie brauchen nur type, die Ihre Java-Klasse, die Sie zu füllen versuchen, so können Sie die ofType zu type bewegen.

Für One-One-Mapping, können Sie einfach einen <association>-Tag verwenden, oder es gibt einen anderen Ansatz vor, dass Sie einen Java POJOs haben, wie unten angegeben:

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

Sie ein Mapping in XML schreiben kann als unten dargestellt:

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

So Mybatis wird sicherstellen, dass eine Instanz von City und weisen Sie den Wert in capital.name auf diese Instanz des name Eigenschaft erstellen.

Für Eins zu viele ODER Viele zu vielen Mapping Sie können das <collection> Tag der MyBatis-Ergebniskarte erkunden. Für weitere Informationen überprüfen Sie Advacned Result Maps Abschnitt in den bereitgestellten Link.

+0

Sie so viel Dank! Ich werde sofort sitzen und alles ausprobieren! – xross

+0

Wenn ich Tag i eins zu eins verwenden möchte, sollte ich Property, Spalte und ErgebnisMap mit Wert der Schnittstelle für Feld schreiben? (Wie soll ich die Methode nach innen injizieren?) Ich habe diese Webseite gesehen - fortgeschrittene Ergebniskarten, aber ich fand sie nicht genau vollständig. – xross

+0

Zum Beispiel habe ich jetzt einen Fehler: org.mybatis.spring.MyBatisSystemException: verschachtelte Ausnahme ist org.apache.ibatis.exceptions.PersistenceException: ### Fehler beim Abfragen der Datenbank. Ursache: java.lang.IllegalArgumentException: Ergebnis Die Maps-Auflistung enthält keinen Wert für pl.net.manager.dao.RateplanDAO – xross

Verwandte Themen