質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
MyBatis

MyBatisはJavaや.NET Frameworkでなどで使用できる、SQL文や、ストアドプロシージャをオブジェクトと紐付けるO/Rマッピングフレームワークです。

Q&A

解決済

2回答

18223閲覧

selectKeyのkeyPropertyが効かずBindingExceptionが発生してしまう

milkman4

総合スコア31

MyBatis

MyBatisはJavaや.NET Frameworkでなどで使用できる、SQL文や、ストアドプロシージャをオブジェクトと紐付けるO/Rマッピングフレームワークです。

0グッド

1クリップ

投稿2016/03/04 22:32

シーケンスからnextvalを取得してinsert文の主キーにあてようとしています。
■シーケンス
CREATE SEQUENCE SEQ_USER_ID INCREMENT 1 MINVALUE 10000001 MAXVALUE 19999999 START 10000001;
■xml
<insert id="insertAccount">
<selectKey keyProperty="userId" resultType="int">
SELECT NEXTVAL('seq_user_id')
</selectKey>
insert into t_user (user_id, account, password)
values (#{userId}, #{account}, #{password})
</insert>

実際に動かしてみるとselectKeyのkeyPropertyが効かずBindingExceptionが発生してしまいます。

■出力される例外
org.apache.ibatis.binding.BindingException: Parameter 'userId' not found. Available parameters are [password, param3, account, param1, email, param2]

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

暫定対応となってしまいますが下記で動作するようになりました。
<insert id="insertAccount">
insert into t_user (user_id, account, password, email)
values (nextval('seq_user_id'), #{account}, #{password}, #{email})
</insert>
postgresでのみ動作するやり方になります。

投稿2016/03/05 14:07

milkman4

総合スコア31

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

insertAccount を使う際にオブジェクトを渡していると思うのですが
例外を見るに、そのオブジェクトに userId のパラメータが紐付けられないと言ってますね。

これら [password, param3, account, param1, email, param2] のパラメータは
あるようですから、int 型の userId が同じように定義しているか確認し、
なければ追加してみると良いのではないでしょうか?
※ getter だけで setter の定義が無いとかも考えられるかもしれません

以上、ご参考になれば幸いです。

投稿2016/03/05 01:07

ps13zier

総合スコア433

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

milkman4

2016/03/05 06:34

ご回答ありがとうございます。 userIdのオブジェクトを渡すのに@paramでIFから渡すのではなくxmlの中でselectKeyを使ってseq_user_idから取得した値をuserIdオブジェクトにセットするように指定しようとしているのですがこれがうまく効かないようで困っております。 <selectKey keyProperty="userId" resultType="int"> SELECT NEXTVAL('seq_user_id') </selectKey> こちらの指定に誤りがあるのかと思うのですが調べてもなかなかそれらしい情報がなく、、、 アドバイスをいただけると大変幸いです。
ps13zier

2016/03/05 23:39

既にベストアンサーついてますが、とりあえず、回答しておきます。 userId のオブジェクトとは一体何でしょう?失礼ながら質問の意図が解らないです。 ごめんなさい。 まず大前提として、 insert で使うパラメータと insert 内の selectKey のパラメータは共用されますので、 selectKey を使う場合、MyBatis は insert 前後のタイミング(デフォルトでは前)で insert に対してパラメータとして渡したオブジェクトが持っている selectKey の keyProperty で指定されたプロパティを setter 経由で、SELECT 結果を使って更新します。 そのため、パラメータとして渡したオブジェクトに keyProperty と対になっている プロパティが無ければ例外を吐かれるのは自然な挙動なのが理解できると思います。 この辺の認識は大丈夫ですか?なので、私は最初の userId プロパティを整備する 回答を行ったわけですが、前提の認識が違ったりして、ライブラリでできない事を 調べていた場合、沢山調べても、なかなか欲しい情報には辿り着かないと思います。 なお、XML で書いているプロパティ名と DB上でのカラム名は必ずしも一致させる 必要はありませんので、入出力の型やらが合っていればダミーの項目でも 構いませんし、なんであれば getter/setter で色々細工をしても構いません。 SQL を書ける人にとっては iBatis/MyBatis はその辺が良い感じに緩いですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問