質問編集履歴

3

一応動作しましたが、理屈が理解できていません。

2022/01/16 09:06

投稿

fnXJ3jPE1tDXd7N
fnXJ3jPE1tDXd7N

スコア10

test CHANGED
File without changes
test CHANGED
@@ -208,3 +208,9 @@
208
208
  「SQL Plusとプログラムで、見ているデータベースが異なるのではないか」とのご指摘の通りのようですが、理屈があまり理解できていません。
209
209
  SQL Plusのconnectの書式か、spring.datasource.urlの書式のどちらかが誤っているのでしょうか?
210
210
 
211
+ ### 2022/01/16追記
212
+ SQL PlusでテーブルをDROPして、アプリ側で「テーブル無し」のエラーとなることを確認しました。
213
+ SQL Plusでテーブルを作成する際に、わざとカラム属性を誤った属性にしたところ、エンティティの生成でエラーとなることを確認しました。
214
+ 以上のことから、SQL Plusとプログラムで見ているデータベースは同じであると考えられます。
215
+ しかし、レコードのINSERTだけ、SQL Plusとプログラムで振る舞いが異なることを確認しています。
216
+

2

2022/01/13 09:19

投稿

fnXJ3jPE1tDXd7N
fnXJ3jPE1tDXd7N

スコア10

test CHANGED
File without changes
test CHANGED
@@ -1,395 +1,210 @@
1
1
  ### Spring Data JPA のクエリメソッド名を使用した検索を行うと、検索結果が0件になる
2
2
 
3
-
4
-
5
3
  チュートリアルを基に、Springを学習中です。
6
-
7
4
  チュートリアルではPostgreSQLを使用していましたが、手持ちの環境の都合上、Oracle 18c XEを使用しました。
8
-
9
5
  「メソッド名からクエリを生成する方法」の所で、意図した検索結果にならず、つまづいています。
10
-
11
6
  具体的には、生成されたクエリを実行すると、SQL Plusだと検索されますが、プログラムからは検索結果が0件になってしまいます。
12
7
 
13
-
14
-
15
8
  ### 発生している問題・エラーメッセージ
16
-
17
9
  ログから、以下のクエリが生成されていることを確認しました。
18
-
19
10
  バインドされた値も確認しました。
20
-
21
11
  ```log
22
-
23
12
  2022-01-07 10:50:52.422 DEBUG 16596 --- [nio-8080-exec-1] org.hibernate.SQL :
24
-
25
13
  select
26
-
27
14
  reservable0_.reserved_date as reserved_date1_1_,
28
-
29
15
  reservable0_.room_id as room_id2_1_
30
-
31
16
  from
32
-
33
17
  reservable_room reservable0_
34
-
35
18
  where
36
-
37
19
  reservable0_.reserved_date=?
38
-
39
20
  order by
40
-
41
21
  reservable0_.room_id asc
42
-
43
22
  Hibernate:
44
-
45
23
  select
46
-
47
24
  reservable0_.reserved_date as reserved_date1_1_,
48
-
49
25
  reservable0_.room_id as room_id2_1_
50
-
51
26
  from
52
-
53
27
  reservable_room reservable0_
54
-
55
28
  where
56
-
57
29
  reservable0_.reserved_date=?
58
-
59
30
  order by
60
-
61
31
  reservable0_.room_id asc
62
-
63
32
  2022-01-07 10:50:52.423 TRACE 16596 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicBinder : binding parameter [1] as [VARCHAR] - [2022-01-07]
64
-
65
- ```
33
+ ```
66
-
67
-
68
34
 
69
35
  SQL Plusの実行結果は以下の通りです(一部省略)。
70
-
71
36
  ```sql
72
-
73
37
  SQL> select
74
-
75
38
  2 reservable0_.reserved_date as reserved_date1_1_,
76
-
77
39
  3 reservable0_.room_id as room_id2_1_
78
-
79
40
  4 from
80
-
81
41
  5 reservable_room reservable0_
82
-
83
42
  6 where
84
-
85
43
  7 reservable0_.reserved_date='2022-01-07'
86
-
87
44
  8 order by
88
-
89
45
  9 reservable0_.room_id asc;
90
46
 
91
-
92
-
93
47
  RESERVED_DATE1_1_
94
-
95
48
  --------------------
96
-
97
49
  ROOM_ID2_1_
98
-
99
50
  -----------
100
-
101
51
  2022-01-07
102
-
103
52
  1
104
53
 
105
-
106
-
107
54
  2022-01-07
108
-
109
55
  2
110
56
 
111
-
112
-
113
57
  2022-01-07
114
-
115
58
  3
116
-
117
59
  (以降省略)
118
60
 
119
-
120
-
121
61
  7行が選択されました。
122
-
123
- ```
62
+ ```
124
-
125
63
  これが、プログラムの実行結果を確認すると、検索結果が0件になります。
126
64
 
127
-
128
-
129
65
  ### 該当のソースコード
130
-
131
66
  検索の実行個所は以下の通りです(一部抜粋)。
132
-
133
- ```java
67
+ ```java
134
-
135
68
  @RequestMapping(method = RequestMethod.GET)
136
-
137
69
  String listRooms(Model model) {
138
-
139
70
  String date = LocalDate.now().toString();
140
71
 
141
-
142
-
143
72
  List<ReservableRoom> rooms = roomService.findReservableRooms(date);
144
-
145
73
  // デバッグ用
146
-
147
74
  System.out.println("rooms count:" + rooms.size()); //ここが0件になる
148
-
149
75
 
150
-
151
76
  model.addAttribute("date", date);
152
-
153
77
  model.addAttribute("rooms", rooms);
154
-
155
78
  return "room/listRooms";
156
-
157
- }
79
+ }
158
-
159
- ```
80
+ ```
160
-
161
81
  検索メソッドのソースは以下の通りです(エンティティのゲッター/セッターは省略しています)。
162
-
163
- ```java
82
+ ```java
164
-
165
83
  @Service
166
-
167
84
  @Transactional
168
-
169
85
  public class RoomService {
170
-
171
-
172
-
86
+
173
87
  @Autowired
174
-
175
88
  ReservableRoomRepository reservableRoomRepository;
176
-
177
-
178
-
89
+
179
90
  public List<ReservableRoom> findReservableRooms(String date) {
180
-
181
91
  return reservableRoomRepository.findByReservableRoomId_reservedDateOrderByReservableRoomId_roomIdAsc(date);
182
-
183
- }
92
+ }
184
-
185
- }
93
+ }
186
-
187
- ```
94
+ ```
188
-
189
- ```java
95
+ ```java
190
-
191
96
  public interface ReservableRoomRepository extends JpaRepository<ReservableRoom, ReservableRoomId> {
192
-
193
97
  List<ReservableRoom> findByReservableRoomId_reservedDateOrderByReservableRoomId_roomIdAsc(String reservedDate);
194
-
195
- }
98
+ }
196
-
197
- ```
99
+ ```
198
-
199
- ```java
100
+ ```java
200
-
201
101
  @Entity
202
-
203
102
  public class ReservableRoom implements Serializable {
204
-
205
103
  @EmbeddedId
206
-
207
104
  private ReservableRoomId reservableRoomId;
208
-
209
-
210
-
105
+
211
106
  @ManyToOne
212
-
213
107
  @JoinColumn(name = "room_id", insertable = false, updatable = false)
214
-
215
108
  @MapsId("roomId")
216
-
217
109
  private MeetingRoom meetingRoom;
218
-
219
-
220
-
110
+
221
111
  public ReservableRoom(ReservableRoomId reservableRoomId) {
222
-
223
112
  this.reservableRoomId = reservableRoomId;
224
-
225
- }
113
+ }
226
-
227
-
228
-
114
+
229
115
  public ReservableRoom() {
230
-
231
- }
116
+ }
232
-
233
117
  //getter/setterは省略
234
-
235
- }
118
+ }
236
-
237
- ```
119
+ ```
238
-
239
- ```java
120
+ ```java
240
-
241
121
  @Embeddable
242
-
243
122
  public class ReservableRoomId implements Serializable {
244
-
245
123
  private Integer roomId;
246
-
247
124
  private String reservedDate;
248
125
 
249
-
250
-
251
126
  public ReservableRoomId(Integer roomId, String reservedDate) {
252
-
253
127
  this.roomId = roomId;
254
-
255
128
  this.reservedDate = reservedDate;
256
-
257
- }
129
+ }
258
-
259
-
260
-
130
+
261
131
  public ReservableRoomId() {
262
-
263
- }
132
+ }
264
-
265
-
266
133
 
267
134
  @Override
268
-
269
135
  public int hashCode() {
270
-
271
136
  final int prime = 31;
272
-
273
137
  int result = 1;
274
-
275
138
  result = prime * result + ((reservedDate == null) ? 0 : reservedDate.hashCode());
276
-
277
139
  result = prime * result + ((roomId == null) ? 0 : roomId.hashCode());
278
-
279
140
  return result;
280
-
281
- }
141
+ }
282
-
283
-
284
-
142
+
285
143
  @Override
286
-
287
144
  public boolean equals(Object obj) {
288
-
289
145
  if(this == obj) return true;
290
-
291
146
  if(obj == null) return false;
292
-
293
147
  if(getClass() != obj.getClass()) return false;
294
-
295
148
  ReservableRoomId other = (ReservableRoomId) obj;
296
-
297
149
  if(reservedDate == null) {
298
-
299
150
  if(other.reservedDate != null) return false;
300
-
301
151
  }else if(!reservedDate.equals(other.reservedDate))
302
-
303
152
  return false;
304
-
305
153
  if(roomId == null) {
306
-
307
154
  if(other.roomId != null) return false;
308
-
309
155
  }else if(!roomId.equals(other.roomId))
310
-
311
156
  return false;
312
-
313
157
  return true;
314
-
315
- }
158
+ }
316
-
317
159
  //getter/setterは省略
318
-
319
- }
160
+ }
320
-
321
- ```
161
+ ```
322
-
323
-
324
-
325
-
326
162
 
327
163
 
328
164
 
329
165
  ### 試したこと
330
-
331
166
  - ログの確認
332
-
333
167
  - SQL Plusでの動作検証
334
-
335
168
  - デバッグ出力の追加
336
-
337
169
  - PostgreSQLとOracleの非互換調査
338
-
339
170
  - チュートリアルとのソースの突合せ
340
-
341
171
  - [Spring Data JPA リファレンス](https://spring.pleiades.io/spring-data/jpa/docs/current/reference/html/#reference)の確認
342
-
343
172
  - Googleで類似事例の確認
344
173
 
345
-
346
-
347
174
  ### 補足情報(FW/ツールのバージョンなど)
348
175
 
349
-
350
-
351
176
  - Spring Boot 2.6.2
352
-
353
177
  - Java 11
354
-
355
178
  - Oracle 18c XE
356
179
 
357
-
358
-
359
180
  ### 2022/01/10追記
360
-
361
- 「SQL Plusとプログラム別のデータベースを見ているのではないか」とのご指摘を受けました。
181
+ 「SQL Plusとプログラムで、見ているデータベースが異なるのではないか」とのご指摘をいただきました。
362
-
182
+ 同じデータベースを参照している認識です。
363
- 以下にSQL Plusのログイン方法及びapplication.propertiesを掲載します。同一のデータベースの認識です。
183
+ 以下にSQL Plusのログインapplication.propertiesを掲載します。
364
-
365
184
  ```sql
366
-
367
185
  connect xxxx/xxxx@//localhost:1521/XEPDB1
368
-
369
- ```
186
+ ```
370
-
371
187
  ```properties
372
-
373
188
  spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
374
-
375
189
  spring.datasource.url=jdbc:oracle:thin:@//localhost:1521/XEPDB1
376
-
377
190
  spring.datasource.username=xxxx
378
-
379
191
  spring.datasource.password=xxxx
380
-
381
192
  spring.jpa.database-platform=org.hibernate.dialect.Oracle10gDialect
382
-
383
193
  spring.jpa.show-sql=true
384
-
385
194
  spring.jpa.hibernate.ddl-auto=validate
386
-
387
195
  spring.jpa.properties.hibernate.format_sql=true
388
-
389
196
  spring.sql.init.encoding=UTF-8
390
-
391
197
  logging.level.org.hibernate.SQL=DEBUG
392
-
393
198
  logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
394
-
395
- ```
199
+ ```
200
+
201
+
202
+ ### 2022/01/13追記
203
+ application.propertiesに以下を追記し、schema.sqlとdata.sqlからデータベースを作成してみたところ、正常に動作しました。
204
+ ```properties
205
+ spring.sql.init.mode=always
206
+ spring.sql.init.schema-locations=classpath:schema.sql
207
+ ```
208
+ 「SQL Plusとプログラムで、見ているデータベースが異なるのではないか」とのご指摘の通りのようですが、理屈があまり理解できていません。
209
+ SQL Plusのconnectの書式か、spring.datasource.urlの書式のどちらかが誤っているのでしょうか?
210
+

1

「SQL Plusとプログラムとで別のデータベースを見ているのではないか」とのご指摘について、ログイン方法とapplication.propertiesを追記しました。

2022/01/10 06:07

投稿

fnXJ3jPE1tDXd7N
fnXJ3jPE1tDXd7N

スコア10

test CHANGED
File without changes
test CHANGED
@@ -353,3 +353,43 @@
353
353
  - Java 11
354
354
 
355
355
  - Oracle 18c XE
356
+
357
+
358
+
359
+ ### 2022/01/10追記
360
+
361
+ 「SQL Plusとプログラムとで別のデータベースを見ているのではないか」とのご指摘を受けました。
362
+
363
+ 以下にSQL Plusのログイン方法及びapplication.propertiesを掲載します。同一のデータベースの認識です。
364
+
365
+ ```sql
366
+
367
+ connect xxxx/xxxx@//localhost:1521/XEPDB1
368
+
369
+ ```
370
+
371
+ ```properties
372
+
373
+ spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
374
+
375
+ spring.datasource.url=jdbc:oracle:thin:@//localhost:1521/XEPDB1
376
+
377
+ spring.datasource.username=xxxx
378
+
379
+ spring.datasource.password=xxxx
380
+
381
+ spring.jpa.database-platform=org.hibernate.dialect.Oracle10gDialect
382
+
383
+ spring.jpa.show-sql=true
384
+
385
+ spring.jpa.hibernate.ddl-auto=validate
386
+
387
+ spring.jpa.properties.hibernate.format_sql=true
388
+
389
+ spring.sql.init.encoding=UTF-8
390
+
391
+ logging.level.org.hibernate.SQL=DEBUG
392
+
393
+ logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
394
+
395
+ ```