前提・実現したいこと
SpringBootでwebアプリケーションを開発しています。
検索機能を実装していて、SQLの部分でエラーが出ていますが原因がわかりません。
何かお気づきの点ありましたら、ご教授いただけると幸いです。
参考にしたサイト
https://dev.classmethod.jp/articles/spring-data-jpa_search/
発生している問題・エラーメッセージ
There was an unexpected error (type=Internal Server Error, status=500). org.hibernate.hql.internal.ast.QuerySyntaxException: expecting IDENT, found '*' near line 1, column 10 [SELECT p.* FROM product p WHERE p.productCode LIKE :productCode ] 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 ]
該当のソースコード
service
1@Service 2public class ProductService { 3 4 @Autowired 5 ProductDao dao; 6 @Autowired 7 ProductRepositoryCustom repositoryCustom; 8 9 public List<Product> search(String productCode, String productName, BigDecimal priceFrom, BigDecimal priceTo) { 10 List<Product> result; 11 if ("".equals(productCode) && "".equals(productName) && priceFrom == null && priceTo == null) { 12 result = dao.findAll(); 13 } else { 14 result = repositoryCustom.search(productCode, productName, priceFrom, priceTo); 15 } 16 return result; 17 } 18
repository
1package com.example.demo.domain.repository; 2 3import java.math.BigDecimal; 4import java.util.List; 5 6import com.example.demo.domain.model.Product; 7 8public interface ProductRepositoryCustom { 9 public List<Product> search(String productCode, String productName, BigDecimal priceFrom, BigDecimal priceTo); 10} 11 12
repository
1@Repository 2public class ProductRepositoryCustomImpl implements ProductRepositoryCustom { 3 4 @Autowired 5 EntityManager manager; 6 7 @SuppressWarnings("unchecked") 8 @Override 9 public List<Product> search(String productCode, String productName, BigDecimal priceFrom, BigDecimal priceTo) { 10 StringBuilder sql = new StringBuilder(); 11 sql.append("SELECT p.* FROM product p WHERE "); 12 boolean andFlg = false; 13 boolean productCodeFlg = false; 14 boolean priceFromFlg = false; 15 boolean priceToFlg = false; 16 if (!"".equals(productCode) && productCode != null) { 17 sql.append(" p.productCode LIKE :productCode "); 18 productCodeFlg = true; 19 andFlg = true; 20 } 21 boolean productNameFlg = false; 22 if (!"".equals(productName) && productName != null) { 23 if (andFlg) 24 sql.append(" AND "); 25 sql.append("p.productName LIKE :productName "); 26 productNameFlg = true; 27 andFlg = true; 28 } 29 if (priceFrom != null) { 30 if (andFlg) 31 sql.append(" AND "); 32 sql.append("p.price >= :priceFrom "); 33 priceFromFlg = true; 34 andFlg = true; 35 } 36 if (priceTo != null) { 37 if (andFlg) 38 sql.append(" AND "); 39 sql.append("p.price <= :priceTo "); 40 priceToFlg = true; 41 andFlg = true; 42 } 43 Query query = manager.createQuery(sql.toString()); 44 if (productCodeFlg) 45 query.setParameter("productCode", "%" + productCode + "%"); 46 if (productNameFlg) 47 query.setParameter("productName", "%" + productName + "%"); 48 if (priceFromFlg) 49 query.setParameter("priceFrom", priceFrom); 50 if (priceToFlg) 51 query.setParameter("priceTo", priceTo); 52 return query.getResultList(); 53 } 54 55} 56
HTML
1<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 2<html xmlns:th="http://www.thymeleaf.org" 3 xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"> 4<head> 5 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></meta> 6</head> 7 <body> 8<div th:fragment="search_contents"> 9 <div class="page-header"> 10 <h1>商品検索画面</h1> 11 </div> 12 <form method="post" action="/search"> 13 <table> 14 <tr><td>商品コード : <input type="text" class="form-control" id="productCode" name="productCode" th:value="${productCode}"/></td></tr> 15 <tr><td>商品名 : <input type="text" class="form-control" id="productName" name="productName" th:value="${productName}"/></td></tr> 16 <tr> 17 <td>価格帯 : <input type="text" class="form-control" id="priceFrom" name="priceFrom" th:value="${priceFrom}"/> 18 ~ <input type="text" class="form-control" id="priceTo" name="priceTo" th:value="${priceTo}"/></td> 19 </tr> 20 <tr><td><input type="submit" value="検索"/></td></tr> 21 </table> 22 </form> 23 <div th:if="${resultSize > 0}"><label th:text="${resultSize}"></label>件</div> 24 <table border="1" th:if="${resultSize > 0}"> 25 <tr> 26 <td>商品ID</td> 27 <td>商品名</td> 28 <td>価格</td> 29 </tr> 30 <tr th:each="data : ${result}"> 31 <td th:text="${data.productCode}"/> 32 <td th:text="${data.productName}"/> 33 <td th:text="${data.price}"/> 34 </tr> 35 </table> 36 </div> 37 </body> 38</html>
model
1package com.example.demo.domain.model; 2 3import javax.persistence.Column; 4import javax.persistence.Entity; 5import javax.persistence.Id; 6import javax.persistence.Table; 7import javax.validation.constraints.NotNull; 8 9import lombok.Data; 10 11@Entity 12@Data 13@Table(name = "product") 14public class Product { 15 16 @Id 17 @Column(name = "productCode") 18 private String productCode; //商品コード 19 20 @Column(name = "productName") 21 private String productName; //商品名 22 23 @NotNull 24 private int price; //値段 25}
DB
1/* 商品マスタのデータ */ 2insert into product(productCode,productName,price) 3values 4('A0001','商品A',10000) 5;
ProductDaoJdbcImpl
1(中略) 2 @Override 3 // Productテーブルのデータを全件取得. 4 public List<Product> selectMany() throws DataAccessException { 5 List<Map<String, Object>> getList = jdbc.queryForList("SELECT * FROM product"); 6 //結果返却用の変数 7 List<Product> productList = new ArrayList<Product>(); 8 //取得したデータを結果返却用のListに格納していく 9 for (Map<String, Object> map : getList) { 10 //Productインスタンスの生成 11 Product product = new Product(); 12 13 //Productインスタンスに取得したデータをセットする 14 product.setProductCode((String) map.get("productCode")); //商品コード 15 product.setProductName((String) map.get("productName")); //商品ID 16 product.setPrice((Integer) map.get("price")); //商品ID 17 18 //結果返却用のListに追加 19 productList.add(product); 20 } 21 return productList; 22 } 23
回答2件
あなたの回答
tips
プレビュー