Spring Boot + Java 11 + Mybatis: @Many 在注解方法中被忽略
Spring Boot + Java 11 + Mybatis: @Many is ignored in Annotations approach
我是Mybatis新手,使用@Many获取数据时遇到问题
我有两个 class,第二个 class 的对象是第一个 class 对象的值 Set<>;
类 是:
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 提供程序,它生成查询字符串:
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();
}
}
最后,我创建了一个映射器:
@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);
}
我的问题是此代码没有 return BavicCredit class 集。 Set 总是空的,就像第一个 class 中定义的那样。似乎根本没有调用方法 selectCredits。
外键存在于数据库中。我相信,我遗漏了一些小代码或 属性 映射。
Java11,Springboot 2.5.0,Mybatis mybatis-spring-boot-starter 2.2.0,数据库Oraclecom.oracle.database.jdbcojdbc8
提前致谢。
PS 我已经尝试了 One to many relationship in MyBatis 但仍然缺少一些东西
当使用嵌套 select [1] 时,column
属性的值应该是第一个查询结果集中的列名。
在您的第一个查询的结果集中,嵌套查询的参数是 id
,因此 @Result
应该如下所示。
@Result(
property = "creditsList",
column = "id",
javaType = Set.class,
many = @Many(select = "selectCredits"))
[1] 有关基础知识,请阅读此 section 文档。
我是Mybatis新手,使用@Many获取数据时遇到问题
我有两个 class,第二个 class 的对象是第一个 class 对象的值 Set<>;
类 是:
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 提供程序,它生成查询字符串:
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();
}
}
最后,我创建了一个映射器:
@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);
}
我的问题是此代码没有 return BavicCredit class 集。 Set 总是空的,就像第一个 class 中定义的那样。似乎根本没有调用方法 selectCredits。 外键存在于数据库中。我相信,我遗漏了一些小代码或 属性 映射。
Java11,Springboot 2.5.0,Mybatis mybatis-spring-boot-starter 2.2.0,数据库Oraclecom.oracle.database.jdbcojdbc8
提前致谢。
PS 我已经尝试了 One to many relationship in MyBatis 但仍然缺少一些东西
当使用嵌套 select [1] 时,column
属性的值应该是第一个查询结果集中的列名。
在您的第一个查询的结果集中,嵌套查询的参数是 id
,因此 @Result
应该如下所示。
@Result(
property = "creditsList",
column = "id",
javaType = Set.class,
many = @Many(select = "selectCredits"))
[1] 有关基础知识,请阅读此 section 文档。