我在数据库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将字符串解析为列表
答案 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的。