首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring + Java 11 +Myb提斯:@许多在注释方法中被忽略

Spring + Java 11 +Myb提斯:@许多在注释方法中被忽略
EN

Stack Overflow用户
提问于 2021-08-12 10:05:15
回答 1查看 229关注 0票数 0

我是Mybatis的新手,在获取@多的数据方面遇到了问题。

我有两个类,第二类对象的值是Set<>的第一类对象;

课程如下:

代码语言:javascript
复制
public class InformationObjectMergedWithCopyrights {

    private Long id;
    private String titleLt;
    private String accountingNumber;
    private String inventoryNumber;
    private Long referenceYear;
    private Long duration;
    private String propertyRights;

    private Set<BavicCredit> creditsList = new HashSet<>();
    
    getters/setters, constructor, toString...
}

public class BavicCredit {

    private Long id;
    private Long informationObjectId;
    private String bavicLabel;
    private String bavicRole;
    
        getters/setters, constructor, toString...
}

我有sql提供程序,它负责查询字符串:

代码语言:javascript
复制
public class InformationObjectSqlProvider {
    public String selectByInventoryNumberConditionAccountingNumber(InventoryNumberReportParamsDao reportParamsDao) {
        
        StringBuilder sql = new StringBuilder("SELECT " +
            "io.ID AS id, " +
            "io.TITLE_LT AS titleLt, " +
            "io.ACCOUNTING_NUMBER AS accountingNumber, " +
            "io.INVENTORY_NUMBER AS inventoryNumber, " +
            "io.REFERENCE_YEAR AS referenceYear, " +
            "io.DURATION AS duration, " +
            "cvt.NAME AS propertyRights  " +
            "FROM SCHEMA_ONE.INFORMATION_OBJECT io " +
            "INNER JOIN SCHEMA_ONE.COPYRIGHTS c ON c.INFORMATION_OBJECT_ID = io.ID " +
            "INNER JOIN SCHEMA_TWO.CLASSIFIER_VALUES cv2 ON c.PROPERTY_RIGHTS = cv2.CODE " +
            "INNER JOIN SCHEMA_TWO.CLASSIFIER_VALUE_TRANSLATIONS cvt ON cv2.ID = cvt.CLASSIFIER_VALUE_ID AND cvt.LANGUAGE_ID = 1 " +
            "WHERE io.INVENTORY_NUMBER = #{reportParamsDao.inventoryNumberCode} ORDER BY accountingNumber ASC");

        return sql.toString();
    }
}

最后,我创建了一个映射器:

代码语言:javascript
复制
@Mapper
public interface InformationObjectMapper {

    InformationObjectSqlProvider provider = new InformationObjectSqlProvider();


    @SelectProvider(type = InformationObjectSqlProvider.class, method = "selectByInventoryNumberConditionAccountingNumber")
    @Results(value = {
        @Result(property = "creditsList",
            column = "SCHEMA_ONE.INF_OBJ_CLASIFFIER.INFORMATION_OBJECT_ID",
            javaType = Set.class, many = @Many(select = "selectCredits"))
    })
    List<InformationObjectMergedWithCopyrights> selectByInventoryNumberConditionAccountingNumber(@Param("reportParamsDao") InventoryNumberReportParamsDao reportParamsDao);

    @Select("SELECT * FROM SCHEMA_ONE.INF_OBJ_CLASSIFIER ioc WHERE ioc.INFORMATION_OBJECT_ID = #{informationObjetId} AND ioc.\"TYPE\" = 'CREDIT' ")
    @Results(value = {
        @Result(property = "bavicLabel", column = "BAVIC_LABEL"),
        @Result(property = "bavicRole", column = "ROLE")
    })
    Set<BavicCredit> selectCredits(@Param("informationObjetId") Long informationObjetId);
}

我的问题是,这段代码不返回BavicCredit类的集合。Set总是空的,就像在第一个类中定义的一样。似乎根本没有调用selectCredits方法。外键存在于数据库中。我相信,我遗漏了一些小代码或属性映射。

Java 11,SpringBoot2.5.0,Mybatis Start2.2.0,数据库Oracle com.oracle.database.jdbc ojdbc8

提前谢谢。

我试过了MyBatis中的一对多关系,但仍然遗漏了一些东西

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-13 11:28:33

当使用嵌套的select 1时,column属性的值应该是第一个查询结果集中的列名。

在第一个查询的结果集中,嵌套查询的参数是id,因此@Result应该如下所示。

代码语言:javascript
复制
@Result(
  property = "creditsList",
  column = "id",
  javaType = Set.class,
  many = @Many(select = "selectCredits"))

1有关基本知识,请阅读文档的部分

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68755379

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档