2017-06-29 7 views
0

を返すように望んでいない:MyBatisのリストを返し、私はこのマッパーinperfaceを書いたMyBatisの3 を使用してPotgreSQLデータベースからデータを取得したいオブジェクト

package datamodel.gis.building; 
public interface BuildingMapperBatis 
{ 
    // List of objects within rectangular box 
    public List<BuildingDbDto> getByBBox(@Param("lat1") BigDecimal lat1, 
              @Param("lon1") BigDecimal lon1, 
              @Param("lat2") BigDecimal lat2, 
              @Param("lon2") BigDecimal lon2); 

    // Retrieve the object by id 
    public BuildingDbDto getById(@Param("id") Long id); 
    /// public List<BuildingDbDto> getById(@Param("id") Long id); 
} 

クラスBuildingDbDtoは些細なDTOオブジェクトでありますプライベートフィールド、パブリックゲッター、セッター、およびすべてのフィールドを初期化するコンストラクターを使用します。

MyBatisのXML構成の一部である:マッパーの

<configuration> 
    <typeAliases> 
     <typeAlias alias="Building" type="datamodel.gis.building.BuildingDbDto" /> 
    </typeAliases> 
    <environments default="default">...here is the connection specified...</environments> 
    <mappers> 
     <mapper resource="datamodel/gis/building/BuildingMapperBatis.xml" /> 
    </mappers> 
</configuration> 

XML構成ファイル内の "/src/main/resources/datamodel/gis/building/BuildingMapperBatis.xml" である:

<?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="datamodel.gis.building.BuildingMapperBatis"> 
    <resultMap id="BuildingMap" type="Building" > 
     <id column="bld_id" property="id" /> 
     <result column="bld_geo_latitude" property="latitude" /> 
     <result column="bld_geo_longitude" property="longitude" /> 
     <result column="bld_addr_settlement_name" property="addrSettlementName" /> 
    </resultMap> 

    <select id="getByBBox" resultMap="BuildingMap"> 
     SELECT bld_id, bld_geo_latitude, bld_geo_longitude, bld_addr_settlement_name 
     FROM get_buildings_in_bbox(#{lat1}, #{lon1}, #{lat2}, #{lon2}) 
    </select> 

    <!-- <select id="getById" resultMap="Building"> --> 
    <select id="getById" resultType="Building"> 
     SELECT bld_id, bld_geo_latitude, bld_geo_longitude, bld_addr_settlement_name 
     FROM get_buildings_in_bbox(0,0,90,90) 
     WHERE bld_id = #{id} 
    </select> 
</mapper> 

それから私は、クエリを実行します。

BuildingMapperBatis mapper = sessionFactory.openSession().getMapper(BuildingMapperBatis.class); 
List<BuildingDbDto> found = mapper.getByBBox(lat1, lon1, lat2, lon2); 
BuildingDbDto dto = mapper.getById(id); 
/*/// 
BuildingDbDto dto = mapper.getById(id).get(0); 
*/ 

getByBBoxが作業を行い方法。

getByIdラインに例外をスローする方法 ".getById(ID);": 「java.lang.IllegalAccessError:クラスcom.sun.proxyからクラスdatamodel.gis.building.BuildingDbDtoにアクセスしよう$。 Proxy0 com.sun.proxy。$ Proxy0.getById(不明なソース) " resultType =" Building "とresultMap =" Building "の両方を試しましたが、結果は同じです。

私は、その行の行を、コメントアウトされた行に置き換えようとしました。私はgetByIdの結果の型をリストに変更し、リストの0番目の要素をとりました。 この変形例では、コードが正しく機能します。しかし、私はこの変換が嫌いです。なぜなら、idによる検索は常に1つの(または何もない)オブジェクトしか返さないからです。

リストではなく単一のオブジェクトを返すメソッドを作成するにはどうすればよいですか?

+0

'getById'クエリで' LIMIT 1'を指定しようとしましたか? – esin88

+0

はい、これは役に立ちませんでした。クエリは正しいです。プライマリキーでデータを検索するため、常に1つのレコードが返されます。 – Pokvalitov

+0

'getById'を' resultMap = "BuildingMap" 'に設定してみてください。珍しいものを見つけることができません – esin88

答えて

0

私の問題の解決策を見つけたので、私は質問に答えます。

私がBuildingDbDtoをパブリッククラスとして宣言しなかったことが、例外の原因でした。私はビジネス層からDTOを隠して、パッケージ保護されたものにしたかったのです。私の意図は、同じパッケージ内のビジネスエンティティ(データゲッターとビジネスロジックのメソッドを含む)にDTOを変換し、ビジネスエンティティを公開することでした。

残念ながら、MyBatis内の魔法は戻り値クラスにアクセスできる必要があるため、DTOは公開されている必要があります。

関連する問題