質問編集履歴
7
文法の追加
title
CHANGED
File without changes
|
body
CHANGED
@@ -151,15 +151,27 @@
|
|
151
151
|
```model
|
152
152
|
package com.example.demo.domain.model;
|
153
153
|
|
154
|
+
import javax.persistence.Column;
|
155
|
+
import javax.persistence.Entity;
|
156
|
+
import javax.persistence.Id;
|
157
|
+
import javax.persistence.Table;
|
158
|
+
import javax.validation.constraints.NotNull;
|
159
|
+
|
154
160
|
import lombok.Data;
|
155
161
|
|
162
|
+
@Entity
|
156
163
|
@Data
|
164
|
+
@Table(name = "product")
|
157
165
|
public class Product {
|
158
166
|
|
167
|
+
@Id
|
168
|
+
@Column(name = "productCode")
|
159
169
|
private String productCode; //商品コード
|
160
170
|
|
171
|
+
@Column(name = "productName")
|
161
172
|
private String productName; //商品名
|
162
173
|
|
174
|
+
@NotNull
|
163
175
|
private int price; //値段
|
164
176
|
}
|
165
177
|
```
|
@@ -169,4 +181,29 @@
|
|
169
181
|
values
|
170
182
|
('A0001','商品A',10000)
|
171
183
|
;
|
184
|
+
```
|
185
|
+
```ProductDaoJdbcImpl
|
186
|
+
(中略)
|
187
|
+
@Override
|
188
|
+
// Productテーブルのデータを全件取得.
|
189
|
+
public List<Product> selectMany() throws DataAccessException {
|
190
|
+
List<Map<String, Object>> getList = jdbc.queryForList("SELECT * FROM product");
|
191
|
+
//結果返却用の変数
|
192
|
+
List<Product> productList = new ArrayList<Product>();
|
193
|
+
//取得したデータを結果返却用のListに格納していく
|
194
|
+
for (Map<String, Object> map : getList) {
|
195
|
+
//Productインスタンスの生成
|
196
|
+
Product product = new Product();
|
197
|
+
|
198
|
+
//Productインスタンスに取得したデータをセットする
|
199
|
+
product.setProductCode((String) map.get("productCode")); //商品コード
|
200
|
+
product.setProductName((String) map.get("productName")); //商品ID
|
201
|
+
product.setPrice((Integer) map.get("price")); //商品ID
|
202
|
+
|
203
|
+
//結果返却用のListに追加
|
204
|
+
productList.add(product);
|
205
|
+
}
|
206
|
+
return productList;
|
207
|
+
}
|
208
|
+
|
172
209
|
```
|
6
誤字の修正
title
CHANGED
File without changes
|
body
CHANGED
@@ -10,8 +10,8 @@
|
|
10
10
|
|
11
11
|
```
|
12
12
|
There was an unexpected error (type=Internal Server Error, status=500).
|
13
|
-
org.hibernate.hql.internal.ast.QuerySyntaxException:
|
14
|
-
|
13
|
+
org.hibernate.hql.internal.ast.QuerySyntaxException: expecting IDENT, found '*' near line 1, column 10 [SELECT p.* FROM product p WHERE p.productCode LIKE :productCode ]
|
14
|
+
java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: expecting IDENT, found '*' near line 1, column 10 [SELECT p.* FROM product p WHERE p.productCode LIKE :productCode ]
|
15
15
|
```
|
16
16
|
|
17
17
|
### 該当のソースコード
|
5
誤字の修正
title
CHANGED
File without changes
|
body
CHANGED
@@ -149,7 +149,6 @@
|
|
149
149
|
</html>
|
150
150
|
```
|
151
151
|
```model
|
152
|
-
/* 商品マスタのデータ */
|
153
152
|
package com.example.demo.domain.model;
|
154
153
|
|
155
154
|
import lombok.Data;
|
4
文法の修正、追加
title
CHANGED
File without changes
|
body
CHANGED
@@ -61,7 +61,7 @@
|
|
61
61
|
@Override
|
62
62
|
public List<Product> search(String productCode, String productName, BigDecimal priceFrom, BigDecimal priceTo) {
|
63
63
|
StringBuilder sql = new StringBuilder();
|
64
|
-
sql.append("SELECT p FROM product p WHERE ");
|
64
|
+
sql.append("SELECT p.* FROM product p WHERE ");
|
65
65
|
boolean andFlg = false;
|
66
66
|
boolean productCodeFlg = false;
|
67
67
|
boolean priceFromFlg = false;
|
@@ -148,6 +148,22 @@
|
|
148
148
|
</body>
|
149
149
|
</html>
|
150
150
|
```
|
151
|
+
```model
|
152
|
+
/* 商品マスタのデータ */
|
153
|
+
package com.example.demo.domain.model;
|
154
|
+
|
155
|
+
import lombok.Data;
|
156
|
+
|
157
|
+
@Data
|
158
|
+
public class Product {
|
159
|
+
|
160
|
+
private String productCode; //商品コード
|
161
|
+
|
162
|
+
private String productName; //商品名
|
163
|
+
|
164
|
+
private int price; //値段
|
165
|
+
}
|
166
|
+
```
|
151
167
|
```DB
|
152
168
|
/* 商品マスタのデータ */
|
153
169
|
insert into product(productCode,productName,price)
|
3
情報の追加
title
CHANGED
File without changes
|
body
CHANGED
@@ -3,6 +3,9 @@
|
|
3
3
|
検索機能を実装していて、SQLの部分でエラーが出ていますが原因がわかりません。
|
4
4
|
何かお気づきの点ありましたら、ご教授いただけると幸いです。
|
5
5
|
|
6
|
+
参考にしたサイト
|
7
|
+
https://dev.classmethod.jp/articles/spring-data-jpa_search/
|
8
|
+
|
6
9
|
### 発生している問題・エラーメッセージ
|
7
10
|
|
8
11
|
```
|
2
内容の修正
title
CHANGED
File without changes
|
body
CHANGED
@@ -1,61 +1,53 @@
|
|
1
1
|
### 前提・実現したいこと
|
2
2
|
SpringBootでwebアプリケーションを開発しています。
|
3
|
-
検索機能を実装していて、SQLの部分でエラーが出て
|
3
|
+
検索機能を実装していて、SQLの部分でエラーが出ていますが原因がわかりません。
|
4
4
|
何かお気づきの点ありましたら、ご教授いただけると幸いです。
|
5
5
|
|
6
6
|
### 発生している問題・エラーメッセージ
|
7
7
|
|
8
8
|
```
|
9
9
|
There was an unexpected error (type=Internal Server Error, status=500).
|
10
|
-
org.hibernate.hql.internal.ast.QuerySyntaxException:
|
11
|
-
org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.hql.internal.ast.QuerySyntaxException:
|
10
|
+
org.hibernate.hql.internal.ast.QuerySyntaxException: product is not mapped [SELECT p FROM product p WHERE p.productCode LIKE :productCode ]; nested exception is java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: product is not mapped [SELECT p FROM product p WHERE p.productCode LIKE :productCode ]
|
11
|
+
org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.hql.internal.ast.QuerySyntaxException: product is not mapped [SELECT p FROM product p WHERE p.productCode LIKE :productCode ]; nested exception is java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: product is not mapped [SELECT p FROM product p WHERE p.productCode LIKE :productCode ]
|
12
12
|
```
|
13
13
|
|
14
14
|
### 該当のソースコード
|
15
15
|
|
16
16
|
```service
|
17
|
-
package com.example.demo.domain.service;
|
18
|
-
|
19
|
-
import java.util.List;
|
20
|
-
|
21
|
-
import org.springframework.beans.factory.annotation.Autowired;
|
22
|
-
import org.springframework.stereotype.Service;
|
23
|
-
|
24
|
-
import com.example.demo.domain.model.Product;
|
25
|
-
import com.example.demo.domain.repository.ProductDao;
|
26
|
-
import com.example.demo.domain.repository.ProductRepositoryCustom;
|
27
|
-
|
28
17
|
@Service
|
29
18
|
public class ProductService {
|
30
19
|
|
31
20
|
@Autowired
|
21
|
+
ProductDao dao;
|
22
|
+
@Autowired
|
32
23
|
ProductRepositoryCustom repositoryCustom;
|
33
24
|
|
34
|
-
public List<Product> search(String productCode, String productName,
|
25
|
+
public List<Product> search(String productCode, String productName, BigDecimal priceFrom, BigDecimal priceTo) {
|
35
26
|
List<Product> result;
|
36
|
-
if ("".equals(productCode) && "".equals(productName)) {
|
27
|
+
if ("".equals(productCode) && "".equals(productName) && priceFrom == null && priceTo == null) {
|
37
28
|
result = dao.findAll();
|
38
29
|
} else {
|
39
|
-
result = repositoryCustom.search(productCode, productName,
|
30
|
+
result = repositoryCustom.search(productCode, productName, priceFrom, priceTo);
|
40
31
|
}
|
41
32
|
return result;
|
42
33
|
}
|
43
34
|
|
44
35
|
```
|
45
36
|
```repository
|
46
|
-
package com.example.demo.domain.
|
37
|
+
package com.example.demo.domain.repository;
|
47
38
|
|
39
|
+
import java.math.BigDecimal;
|
48
40
|
import java.util.List;
|
49
41
|
|
50
|
-
import
|
42
|
+
import com.example.demo.domain.model.Product;
|
51
|
-
import javax.persistence.Query;
|
52
43
|
|
53
|
-
import org.springframework.beans.factory.annotation.Autowired;
|
54
|
-
|
44
|
+
public interface ProductRepositoryCustom {
|
45
|
+
public List<Product> search(String productCode, String productName, BigDecimal priceFrom, BigDecimal priceTo);
|
46
|
+
}
|
55
47
|
|
56
|
-
import com.example.demo.domain.model.Product;
|
57
|
-
import com.example.demo.domain.repository.ProductRepositoryCustom;
|
58
48
|
|
49
|
+
```
|
50
|
+
```repository
|
59
51
|
@Repository
|
60
52
|
public class ProductRepositoryCustomImpl implements ProductRepositoryCustom {
|
61
53
|
|
@@ -64,15 +56,15 @@
|
|
64
56
|
|
65
57
|
@SuppressWarnings("unchecked")
|
66
58
|
@Override
|
67
|
-
public List<Product> search(String productCode, String productName,
|
59
|
+
public List<Product> search(String productCode, String productName, BigDecimal priceFrom, BigDecimal priceTo) {
|
68
60
|
StringBuilder sql = new StringBuilder();
|
69
|
-
sql.append("SELECT
|
61
|
+
sql.append("SELECT p FROM product p WHERE ");
|
70
62
|
boolean andFlg = false;
|
71
63
|
boolean productCodeFlg = false;
|
72
|
-
boolean
|
64
|
+
boolean priceFromFlg = false;
|
73
|
-
boolean
|
65
|
+
boolean priceToFlg = false;
|
74
66
|
if (!"".equals(productCode) && productCode != null) {
|
75
|
-
sql.append(" productCode LIKE :productCode ");
|
67
|
+
sql.append(" p.productCode LIKE :productCode ");
|
76
68
|
productCodeFlg = true;
|
77
69
|
andFlg = true;
|
78
70
|
}
|
@@ -80,16 +72,33 @@
|
|
80
72
|
if (!"".equals(productName) && productName != null) {
|
81
73
|
if (andFlg)
|
82
74
|
sql.append(" AND ");
|
83
|
-
sql.append("productName LIKE :productName ");
|
75
|
+
sql.append("p.productName LIKE :productName ");
|
84
76
|
productNameFlg = true;
|
85
77
|
andFlg = true;
|
86
78
|
}
|
87
|
-
|
79
|
+
if (priceFrom != null) {
|
80
|
+
if (andFlg)
|
81
|
+
sql.append(" AND ");
|
82
|
+
sql.append("p.price >= :priceFrom ");
|
83
|
+
priceFromFlg = true;
|
84
|
+
andFlg = true;
|
85
|
+
}
|
86
|
+
if (priceTo != null) {
|
87
|
+
if (andFlg)
|
88
|
+
sql.append(" AND ");
|
89
|
+
sql.append("p.price <= :priceTo ");
|
90
|
+
priceToFlg = true;
|
91
|
+
andFlg = true;
|
92
|
+
}
|
88
93
|
Query query = manager.createQuery(sql.toString());
|
89
94
|
if (productCodeFlg)
|
90
95
|
query.setParameter("productCode", "%" + productCode + "%");
|
91
96
|
if (productNameFlg)
|
92
97
|
query.setParameter("productName", "%" + productName + "%");
|
98
|
+
if (priceFromFlg)
|
99
|
+
query.setParameter("priceFrom", priceFrom);
|
100
|
+
if (priceToFlg)
|
101
|
+
query.setParameter("priceTo", priceTo);
|
93
102
|
return query.getResultList();
|
94
103
|
}
|
95
104
|
|
@@ -113,8 +122,8 @@
|
|
113
122
|
<tr><td>商品コード : <input type="text" class="form-control" id="productCode" name="productCode" th:value="${productCode}"/></td></tr>
|
114
123
|
<tr><td>商品名 : <input type="text" class="form-control" id="productName" name="productName" th:value="${productName}"/></td></tr>
|
115
124
|
<tr>
|
116
|
-
<td>価格帯 : <input type="text" class="form-control" id="
|
125
|
+
<td>価格帯 : <input type="text" class="form-control" id="priceFrom" name="priceFrom" th:value="${priceFrom}"/>
|
117
|
-
~ <input type="text" class="form-control" id="
|
126
|
+
~ <input type="text" class="form-control" id="priceTo" name="priceTo" th:value="${priceTo}"/></td>
|
118
127
|
</tr>
|
119
128
|
<tr><td><input type="submit" value="検索"/></td></tr>
|
120
129
|
</table>
|
@@ -135,4 +144,11 @@
|
|
135
144
|
</div>
|
136
145
|
</body>
|
137
146
|
</html>
|
147
|
+
```
|
148
|
+
```DB
|
149
|
+
/* 商品マスタのデータ */
|
150
|
+
insert into product(productCode,productName,price)
|
151
|
+
values
|
152
|
+
('A0001','商品A',10000)
|
153
|
+
;
|
138
154
|
```
|
1
不要な文の削除
title
CHANGED
File without changes
|
body
CHANGED
@@ -135,13 +135,4 @@
|
|
135
135
|
</div>
|
136
136
|
</body>
|
137
137
|
</html>
|
138
|
-
```
|
138
|
+
```
|
139
|
-
|
140
|
-
|
141
|
-
### 試したこと
|
142
|
-
|
143
|
-
ここに問題に対して試したことを記載してください。
|
144
|
-
|
145
|
-
### 補足情報(FW/ツールのバージョンなど)
|
146
|
-
|
147
|
-
ここにより詳細な情報を記載してください。
|