🦄

配列・Enum値をDTOで管理するSQL検索機能の実装方法

2025/02/13に公開

https://zenn.dev/takeda_kaho/articles/67466ef5e4ba75#in

この記事のINを参考に


今回やりたかったこと

  • 検索機能[男・女]

前提

  • SQL[PostgreSQL]ではgenderというカラム名でINTEGER型
  • namedvalueでenumで定義され男・MANなど加工されている
  • 検索フォームではlist Gender.values()で格納
  • actionでgenders定義・デバックで確認して値は正しく取れてると判明
  • 検索条件に該当する人はDTOファイルから取ってきている
    [DTOとは]:エンティティに「追加情報」を持たせたいときに使う仮想の箱!
元々の私のコード
/*IF genders != null && genders?seq_contains(1) */
AND p.gender = 1
/*END*/
/*IF genders != null && genders?seq_contains(2) */
AND p.gender = 2
/*END*/

エラーが起き、デバックでそもそも値が取れているのかを見たら[]とか[]と文字列で取れてました。じゃあ!と下記に変更

修正版
/*IF genders != null && genders?seq_contains("男") */
AND p.gender = 1
/*END*/
/*IF genders != null && genders?seq_contains("女") */
AND p.gender = 2
/*END*/

これもエラーでした(笑)

けど、、どう解決していいかわからない。思わず先輩に泣きつきました😅

まず結果から

最終コード
/*IF genders != null && genders.length > 0 */
AND p.gender IN /*genders*/(0)
/*END*/

まず配列で値を取ってきてるのでINを使う。
INは記事にもあった通り複数の条件式をつなぐ必要がある場合に有効。
=配列で複数の値がある可能性があるからINを使う
今回のコードはgnders(配列)が空じゃないかつ配列に1つでも中身があればp.genderにgendersを入れてなければ(/)ゼロを(0)入れる!三項演算子みたいな書き方だ😲😲


📝 学びメモ
✅ Enumを使う場合は、実際にSQLで扱う型(数値 or 文字列)と比較すること!
✅ 複数の値を検索するときは IN を活用するとスマート!
✅ SQLのデフォルト値 (0) などを入れるとエラー回避しやすい

今後DTOやSQLで複数の値やnamedvalueで加工したデータ・特にenumとか使ってる場合は参考にしよう。

Discussion