質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

解決済

2回答

3756閲覧

Springで検索機能を実装中、SQLエラーが出る

TaSa

総合スコア1

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

0クリップ

投稿2020/05/22 05:18

編集2020/05/25 05:16

前提・実現したいこと

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/05/22 12:04

JPQL か HQLだとおもうぞそれ SQLだったらシンタックスエラーだな
q_sane_q

2020/05/25 03:08

これ多分質問書き直されてると思いますが、URL先見た感じSQLじゃなくてJPQLっぽいですね それよりProductクラスが気になるんですけど 最近Lombok使ってないので記憶が曖昧ですが@DataってアクセサとかHashCodeとかやってくれるだけでしたよね? @Entity、@Table、@Columnあたりも必要では?
TaSa

2020/05/25 05:13

>q_sane_q さん ご指摘ありがとうございます。 Productクラスに@Entity、@Table、@Columnを追加すると ProductDaoJdbcImplクラスがうまく機能せず、マスタデータの登録がうまくできなくなってしまいます。 こちら何かお気づきの点ございますでしょうか。
guest

回答2

0

まあどっちでもいける方法で回答

String sql ="SELECT ~ ": // WHERE を含まない StringBuilder conditions = new StringBuilder (); if(condition1 != null && condition1.length != 0) { conditions.append(" condition1 = :condition1 "); } if(condition2 != null && condition2.length != 0) { if (conditions.ength() > 0 ) { conditions.append("AND "); } conditions.append("condition2 = :condition2 "); } // 3項目目以降は割愛 if (conditions.ength() > 0 ) { sql = sql + " WHERE " + conditions.toString(); } Query query = manager.createQuery(sql.toString()); // JPQL(HQL) // Query query = manager.createNativeQuery(sql.toString()); // SQL // パラメーター設定は割愛 return query.getResultList();

投稿2020/05/25 05:20

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

SELECT p FROM
これではカラムが選ばれてません。
ひとまずSELECT p.* FROMでどうでしょう。

※SQLでもなんでも、まず実際に直接実行して通るSQLを組んでからアプリケーションから実行しましょう

投稿2020/05/24 20:51

編集2020/05/25 02:47
m.ts10806

総合スコア80875

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TaSa

2020/05/25 02:35

>m.ts10806 さん ご教授ありがとうございます。 SELECT p.* FROM で実行しましたが、やはりエラーが出てしまいます。 SQLの記述がよくないのか、それとも他の個所が原因なのかわからないです。
m.ts10806

2020/05/25 02:48

teratail投稿バグで途中で切れてましたので再編集してます。 問題切り分けのために、アプリケーションから実行されているSQLを取得し、直にDBへじっ行してください
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問