2

Postgres DB の 2d char 配列をネイティブ Java char[][] に変換するにはどうすればよいですか? これは、この回答に基づく私の試みです:

import java.sql.Array;
import java.sql.ResultSet;
import java.sql.SQLException;

import org.skife.jdbi.v2.StatementContext;
import org.skife.jdbi.v2.tweak.ResultSetMapper;

public class GameMapper implements ResultSetMapper<Game>{
    public Game map(int index, ResultSet resultSet, StatementContext statementContext) throws SQLException
    {
        Array board = resultSet.getArray("BOARD");
        return new Game(resultSet.getInt("ID"),
                        resultSet.getInt("WHOSE_TURN"),
                        resultSet.getInt("WINNER"),
                        (char[][]) board.getArray());
    }
}

データクラス:

public class Game {
    protected int id; 
    protected int whoseTurn;
    protected int winner;
    protected char[][] board;

    public Game(int id, int turn, int winner, char[][] board ) {
        this.id=id;
        this.whoseTurn=turn;
        this.winner=winner;
        this.board=board;
    }

    @JsonProperty
    public int getId() {
        return id;
    }

    @JsonInclude(Include.NON_NULL)
    public int getWhoseTurn() {
        return whoseTurn;
    }

    @JsonInclude(Include.NON_NULL)
    public int getWinner() {
        return winner;
    }

    public char[][] getBoard() {
        return board;
    }   
}

ダオ:

@RegisterMapper(GameMapper.class)
public interface GameDAO {

    @SqlUpdate("create table if not exists GAMES (ID integer, WHOSE_TURN varchar(10), WINNER varchar(10), BOARD char(1)[][])")
    void createTableIfNotExists();

    @SqlUpdate("insert into GAMES (ID, WHOSE_TURN, WINNER, BOARD) values (:id, :whoseTurn, :winner, :board)")
    void insert(@BindBean Game game);
}

しかし、これはキャストエラーになります:

java.lang.ClassCastException: [[Ljava.lang.String; cannot be cast to [[C

代わりにResultSetを使用する必要がありますか?

4

2 に答える 2

4

[[Ljava.lang.String; [[C にキャストすることはできません

Java 配列型の名前が何を意味するのかを学びましょう

[ですarray-of。array-of array-of も同様です。つまり[[、どちらの型名も 2 次元配列です。

L参照型を示し、その後にクラス名が続きます。

Cプリミティブ型charです。

ここで、 の 2 次元配列をjava.lang.Stringの 2次元配列にキャストしようとしていることがわかりますchar。それは意味がありません。JDBI は Java データ型をやのcharような SQL 文字列型にマップしているようです(データベースのテーブルをチェックして確認してください)。その場合、JDBC ドライバーはそれをデータベースから として返します。charactercharacter varyingjava.lang.String

そのため、そのマッピングをオーバーライドしてデータベースのデータ型"char"(1 文字) を使用するか、より簡単に言えば、文字列が 1 文字の長さであることをアサートして文字にアンパックする必要があります。したがって、配列をコピーする必要があります。

于 2015-10-12T06:16:37.493 に答える
1

postgres JDBC ドライバーを見てみました。列の型が CHAR または VARCHAR の場合、文字列配列に変換しようとします。

    else if (type == Types.CHAR || type == Types.VARCHAR)
    {
        Object[] oa = null;
        ret = oa = (dims > 1 ? (Object[]) java.lang.reflect.Array.newInstance(String.class, dimsLength) : new String[count]);
    }

したがって、2D String 配列が得られます。マッパーで char[][] に変換する必要があります。

于 2015-10-12T09:43:38.857 に答える