亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

mybatis中如何選擇文本數組類型的結果?

mybatis中如何選擇文本數組類型的結果?

慕碼人8056858 2022-11-02 16:58:08
例如text[],在 PostgreSQL 中有一個表,它的列類型為 :CREATE TABLE t(    id integer,    name text,    tags text[],    PRIMARY KEY (id))現在,我想通過tags兩種方式進行選擇:tags使用主鍵選擇id,結果應該是類型List<String>選擇tagsusing name,結果應該是 typeList<List<String>>我應該如何編寫 MyBatis 映射器來實現這一點?
查看完整描述

2 回答

?
蠱毒傳說

TA貢獻1895條經驗 獲得超3個贊

你仍然可以使用 Java 映射器,但是,SqlSession#selectList當返回類型是List并且這不是你想要的時,MyBatis 會在內部調用。

因此,您需要改為使用Object作為返回類型。


@Select("select tags from t where id = #{id}")

Object getTagById(Integer id);


@Select("select tags from t where name = #{name}")

List<Object> getTagByName(String name);

并在配置中全局注冊您的類型處理程序。IE


<typeHandlers>

  <typeHandler handler="xxx.yyy.ListArrayTypeHandler" />

</typeHandlers>

或者


configuration.getTypeHandlerRegistry()

  .register(ListArrayTypeHandler.class);

為了完整起見,這里是一個示例類型處理程序實現。


import java.sql.Array;

import java.sql.CallableStatement;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.util.ArrayList;

import java.util.Arrays;

import java.util.List;


import org.apache.ibatis.type.BaseTypeHandler;

import org.apache.ibatis.type.JdbcType;

import org.apache.ibatis.type.MappedJdbcTypes;

import org.apache.ibatis.type.MappedTypes;


@MappedJdbcTypes({ JdbcType.ARRAY })

@MappedTypes({ Object.class })

public class ListArrayTypeHandler extends BaseTypeHandler<List<?>> {


  @Override

  public void setNonNullParameter(PreparedStatement ps, int i,

      List<?> parameter, JdbcType jdbcType) throws SQLException {

    //  JDBC type is required

    Array array = ps.getConnection().createArrayOf("TEXT", parameter.toArray());

    try {

      ps.setArray(i, array);

    } finally {

      array.free();

    }

  }


  @Override

  public List<?> getNullableResult(ResultSet rs, String columnName) throws SQLException {

    return extractArray(rs.getArray(columnName));

  }


  @Override

  public List<?> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {

    return extractArray(rs.getArray(columnIndex));

  }


  @Override

  public List<?> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {

    return extractArray(cs.getArray(columnIndex));

  }


  protected List<?> extractArray(Array array) throws SQLException {

    if (array == null) {

      return null;

    }

    Object javaArray = array.getArray();

    array.free();

    return new ArrayList<>(Arrays.asList((Object[])javaArray));

  }

}

僅供參考,要將 a 存儲List到tags列中,您可能必須明確指定類型處理程序。


insert into t (...) values (#{id}, #{name},

  #{tags,typeHandler=xxx.yyy.ListArrayTypeHandler})


查看完整回答
反對 回復 2022-11-02
?
郎朗坤

TA貢獻1921條經驗 獲得超9個贊

你不是第一個遇到這個問題的人。


項目common-mybatis有一個專門針對這個用例的類型處理程序:StringArrayTypeHandler


只需將其添加到 MyBatis 配置中:


    <typeHandlers>

        <typeHandler handler="org.gbif.mybatis.type.StringArrayTypeHandler"/>

    </typeHandlers>

...然后對于映射,它很簡單:


    <select id="getTagsById" resultType="java.util.List">

        SELECT tags FROM t WHERE id = #{id}

    </select>


    <select id="getTagsByName" resultType="java.util.List">

        SELECT tags FROM t WHERE name = #{name}

    </select>

...在代碼中:


try (SqlSession session = sessionFactory.openSession()) {

    List<String> tags = session.selectOne("[...].getTagsById", 1);

    System.out.println("Tags: " + tags);


    List<List<String>> multiTags = session.selectList("[...].getTagsByName", "test");

    System.out.println("Tags: " + multiTags);

}

使用 JDBC 驅動程序版本 42.2.5 和以下測試數據針對 PostgreSQL 11 進行測試:


select * from t;

 id |  name   |                tags                

----+---------+------------------------------------

  1 | test    | {Thriller,Drama}

  2 | my name | {Science-Fiction,Adventure,Horror}

  3 | test    | {Comedy,Adventure}

(3 rows)

...產生:


Tags: [Thriller, Drama]

Tags: [[Thriller, Drama], [Comedy, Adventure]]


查看完整回答
反對 回復 2022-11-02
  • 2 回答
  • 0 關注
  • 106 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號