MyBatis映射结果到MyBatisRepository中的List <String>

时间:2020-05-12 13:24:50

标签: java mybatis spring-mybatis

我在数据库enter image description here中有一行

和Java函数

@Select("<script>\n" +
            "SELECT TARIFF FROM MY_TABLE WHERE ROW_ID = #{id}\n" +
       "</script>\n")
List<String> findTariffById(@Param("id") String id);

如果我添加@ResultType(String.class),则会获得包含1个元素的列表:“经典;高级;我的对话”

但是我需要获取包含3个元素的列表:

“经典”

“高级”

“我的对话”

如果我有POJO类关税

@Data
public class Tariff{

    private List<String> name;

}

我可以将功能更改为

@Select("<script>\n" +
            "SELECT TARIFF FROM MY_TABLE WHERE ROW_ID = #{id}\n" +
       "</script>\n")
@Results({
    @Result(property = "name", column = "TARIFF", typeHandler = StringArrayListTypeHandler.class)}
)
Tariff findTariffById(@Param("id") String id);

开心吧。

但是,我需要获得List<String>

是否可以创建List<String>而无需创建POJO?

P.S。 StringArrayListTypeHandler将字符串解析为列表

2 个答案:

答案 0 :(得分:0)

您可以从第一个结果开始,然后将其拆分为数组列表。在我的代码摘录中,起始列表为空,但正如您所评论的,您应该使用从数据库初始化的大小为1的列表。因此,您可以使用分隔符“;”手动分割字符串。

        List<String> returnedListOfSizeOne = new ArrayList<>(); //.add("classic;premium;my-conversation")
        List<String> properlySplitString = new ArrayList<>();
        for(String string: returnedListOfSizeOne){
            Collections.addAll(properlySplitString,string.split(";"));
        }

答案 1 :(得分:0)

通过使用Java 8+中的默认方法,可以避免创建POJO并在映射器中仍然具有逻辑:

interface MyMapper {
  @Select("<script>\n" +
            "SELECT TARIFF FROM MY_TABLE WHERE ROW_ID = #{id}\n" +
       "</script>\n")
  String findTariffStringById(@Param("id") String id);

  default List<String> findTariffById(String id) {
     String tariffString = findTarrifStringById(id)
     return Arrays.asList(tariffString.split(";"));
  }
}

否则,您不能将JDBC结果集中返回的行映射到从映射器获得的结果中的多个对象。要么用Java要么用DB做。例如对于this之类的postgres,here是针对mysql的。

相关问题