Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java MyBatis返回一个列表,不想返回对象_Java_Postgresql_Mybatis - Fatal编程技术网

Java MyBatis返回一个列表,不想返回对象

Java MyBatis返回一个列表,不想返回对象,java,postgresql,mybatis,Java,Postgresql,Mybatis,我想使用MyBatis 3从PostgreSQL数据库检索数据。 我在Perface中编写了此映射程序: package datamodel.gis.building; public interface BuildingMapperBatis { // List of objects within rectangular box public List<BuildingDbDto> getByBBox( @Param("lat1") BigDeci

我想使用MyBatis 3从PostgreSQL数据库检索数据。 我在Perface中编写了此映射程序:

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对象,具有私有字段、公共getter、no setter和初始化所有字段的构造函数

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>
文件/src/main/resources/datamodel/gis/building/BuildingMapperBatis.XML中映射器的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;行抛出异常: java.lang.IllegalAccessError:试图从com.sun.proxy类访问类datamodel.gis.building.BuildingDbDto。$Proxy0 位于com.sun.proxy.$Proxy0.getById未知源 我尝试了resultType=Building和resultMap=Building,结果是一样的

我试着把那几行代码替换成注释掉的代码。我将getById的结果类型更改为列表,并获取列表的第0个元素。 在这个变体中,代码工作正常。但我不喜欢这种转换,因为按id搜索总是只返回一个或无对象


如何使方法返回单个对象而不是列表?

我已经找到了问题的解决方案,所以我回答了问题

异常的原因是我没有将BuildingDbDto声明为公共类。我想对业务层隐藏DTO,并对其进行包保护。我的意图是将DTO转换为一个business实体,其中包含同一包中业务逻辑的数据获取程序和方法,并将business实体公开


不幸的是,MyBatis中的魔法必须能够访问返回值类,因此DTO必须是公共的。

我找到了问题的解决方案,所以我回答了我的问题

异常的原因是我没有将BuildingDbDto声明为公共类。我想对业务层隐藏DTO,并对其进行包保护。我的意图是将DTO转换为一个business实体,其中包含同一包中业务逻辑的数据获取程序和方法,并将business实体公开


不幸的是,MyBatis中的魔法必须能够访问返回值类,因此DTO必须是公共的。

您是否尝试在getById查询中指定限制1?是的,但这没有帮助。查询是正确的,它总是返回一条记录,因为它按主键搜索数据。请尝试将getById设置为resultMap=BuildingMap。。在getById查询中尝试指定限制1后,找不到任何其他看起来不正常的内容?是的,但这没有帮助。查询是正确的,它总是返回一条记录,因为它按主键搜索数据。请尝试将getById设置为resultMap=BuildingMap。。找不到任何其他看起来不寻常的东西