を返すように望んでいない: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つの(または何もない)オブジェクトしか返さないからです。
リストではなく単一のオブジェクトを返すメソッドを作成するにはどうすればよいですか?
'getById'クエリで' LIMIT 1'を指定しようとしましたか? – esin88
はい、これは役に立ちませんでした。クエリは正しいです。プライマリキーでデータを検索するため、常に1つのレコードが返されます。 – Pokvalitov
'getById'を' resultMap = "BuildingMap" 'に設定してみてください。珍しいものを見つけることができません – esin88