質問編集履歴

2

パッケージ名クラス名の編纂

2016/07/14 07:43

投稿

poyopi
poyopi

スコア113

test CHANGED
File without changes
test CHANGED
@@ -144,7 +144,7 @@
144
144
 
145
145
  <!-- 対象のテーブル名でテーブル存在チェックをおこなう -->
146
146
 
147
- <select id="existTable" resultType="sso.repository.ExistTableDTO">
147
+ <select id="existTable" resultType="package.DTO">
148
148
 
149
149
  SELECT relname,
150
150
 

1

解決のメモ

2016/07/14 07:43

投稿

poyopi
poyopi

スコア113

test CHANGED
File without changes
test CHANGED
@@ -91,3 +91,113 @@
91
91
 
92
92
 
93
93
  実際にはORMapperを使って動的SQLとして生成したものを使いますが、可能ならばプログラムにテーブル有無チェックのようなロジックを持たせるのは避けたいと思っています。
94
+
95
+
96
+
97
+ ---
98
+
99
+ (当質問は[#39274](https://teratail.com/questions/39274)からの続きです)
100
+
101
+ 遅くなりましたがやりたいことの実現ができたので備忘録を兼ねて以下に記載します。
102
+
103
+ すぐ上で
104
+
105
+ > 可能ならばプログラムにテーブル有無チェックのようなロジックを持たせるのは避けたいと思っています。
106
+
107
+
108
+
109
+ という夢をもっていましたが、[masuda_yuya](https://teratail.com/users/masuda_yuya)さんにご回答いただいたとおりSQLで一挙にまかなうのは無理のようでしたので、存在チェック用のクエリを投げて、その結果存在するテーブル名をリスト(```List<String>```)に詰めて、そのリストをmybatisのforeachで回してUNIONという風にしました。新しく実装するのは、
110
+
111
+ - テーブル存在チェックSQL
112
+
113
+ - テーブル存在チェックSQLのDTO
114
+
115
+
116
+
117
+ としました。
118
+
119
+ ```SQL
120
+
121
+ select relname,
122
+
123
+ case
124
+
125
+ when relname='存在チェックしたいテーブル名1' then true
126
+
127
+ when relname='存在チェックしたいテーブル名2' then true
128
+
129
+ when relname='存在チェックしたいテーブル名3' then true
130
+
131
+ when relname='存在チェックしたいテーブル名4' then true
132
+
133
+ else false
134
+
135
+ end as existTable
136
+
137
+ from pg_class where relkind='r'
138
+
139
+ ```
140
+
141
+ ベタSQLだと上のようになりますが、チェック対象とするテーブル群はロジックでまた別のListにつめてるのでこれもmybatis上ではforeachします。このクエリの結果をうけて、Listの中には```existTable```がtrueだったものの```relname```をつめていきます(pg_classからとってきてるので余計なテーブル名も抽出されますが、```case when```で名前を指定しているもの以外はtrueになりません)。あとはそのListを使って目的のSQLでUNIONを行います。
142
+
143
+ ```XML
144
+
145
+ <!-- 対象のテーブル名でテーブル存在チェックをおこなう -->
146
+
147
+ <select id="existTable" resultType="sso.repository.ExistTableDTO">
148
+
149
+ SELECT relname,
150
+
151
+ CASE WHEN
152
+
153
+ <foreach item="target" collection="targetList" separator=" WHEN ">
154
+
155
+ relname=#{target} THEN true
156
+
157
+ </foreach>
158
+
159
+ ELSE false
160
+
161
+ END AS existTable
162
+
163
+ FROM pg_class where relkind='r'
164
+
165
+ </select>
166
+
167
+ ```
168
+
169
+
170
+
171
+ ```XML
172
+
173
+ <!-- 存在したテーブルはUNIONする -->
174
+
175
+ <select id="hogehoge" resultType="package.DTO">
176
+
177
+ SELECT
178
+
179
+ * FROM
180
+
181
+ (
182
+
183
+ SELECT * FROM basetable
184
+
185
+ <foreach item="existTable" collection="existTableList" separator=" ">
186
+
187
+ UNION ALL SELECT * FROM ${existTable}
188
+
189
+ </foreach>
190
+
191
+ ) tables
192
+
193
+ <where>
194
+
195
+ <!-- 適宜条件 -->
196
+
197
+ </where>
198
+
199
+ </select>
200
+
201
+ ```
202
+
203
+ 説明がいつにもまして雑ですが、同じことで行き詰った人の一助となれば幸いです。