復習日記

勤務時間内で理解できなかったことやつまづいたことをまとめていく予定。

postgresqlのjson型をdomaで扱う

この記事を見ると直JDBCなら、postgresqljson型にデータを登録できるらしい。

PostgreSQLのJSON列にJavaからデータを登録する - Symfoware

- insert文の実行→doma側がjson型を認識できないので、失敗する。無念。

2015/6/10追記

domaのデフォルトメソッド内でビルダ使って、postgresqlの関数to_json使えばjson型でもinsertできました。

以下、検証結果。

posgresqlのjson型へのinsertサンプル

  • Entityクラス
package example.entity;

import org.seasar.doma.Column;
import org.seasar.doma.Entity;
import org.seasar.doma.Id;
import org.seasar.doma.Table;

/**
 */
@Entity(listener = CustomerListener.class)
@Table(name = "customer")
public class Customer {

    /** */
    @Id
    @Column(name = "id")
    String id;

    /** */
    @Column(name = "first_name")
    String firstName;

    /** */
    @Column(name = "last_name")
    String lastName;

    /** */
    @Column(name = "jsondata")
    String jsondata;

    /** 
     * getter、setterは省略
     */
}
  • daoインタフェース
package example.dao;

import org.seasar.doma.Dao;
import org.seasar.doma.jdbc.Config;
import org.seasar.doma.jdbc.builder.InsertBuilder;
import example.entity.Customer;

/**
 */
@Dao
@DomaRepository
public interface CustomerBuilderDao {


    /**
     * @param entity
     * @return affected rows
     */
    default int insert(Customer entity) {
        Config config = Config.get(this);

        InsertBuilder builder = InsertBuilder.newInstance(config);
        builder.sql("insert into Customer");
        builder.sql("(id, first_name, last_name, jsondata)");
        builder.sql("values (");
        builder.param(String.class, entity.getId()).sql(", ");
        builder.param(String.class, entity.getFirstName()).sql(", ");
        builder.param(String.class, entity.getLastName()).sql(", ");
        builder.sql(" to_json(");
        builder.param(String.class, entity.getJsondata()).sql("::text)");
        builder.sql(")");
        return builder.execute();
    }
}