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

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

ただいまの
回答率

90.35%

  • Java

    14388questions

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

Spring Bootでテーブルからデータ取得できない

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,059

jpaUser

score 1

Spring Bootでテーブルからデータ取得したいです。

Spring Bootのサンプルを作成しまして、テストするとき、HTMLの初期画面が表示され、がエラーがありませんが、検索ボタンをクリックしても、データを画面に表示しません。
ログからSpringBootで自動生成したSQL文をコピーして、直接DBViewerに実行すると、3件のレコードを取得しました。
Eclipseのデバッグモードで調べつところ、repository.findAll()の実行結果は0件を取得したことがわかりました。
誰かが原因と解決策を教えていただけませんか?

■■環境:Eclipse4.6 java1.8 STS3.9.2 mySql lombok

HTMLファイル

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
  <head>
    <title>商品検索</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
  </head>
  <body>
    <form method="post" name="form1">
      <table>
        <tr><td>商品ID : <input type="text" class="form-control" id="goods_id" name="goodsId" th:value="${goodsId}"/></td></tr>
        <tr><td>商品名 : <input type="text" class="form-control" id="goods_name" name="goodsName" th:value="${goodsName}"/></td></tr>
        <tr>
          <td>価格帯 : <input type="text" class="form-control" id="price_from" name="priceFrom" th:value="${priceFrom}"/><input type="text" class="form-control" id="price_to" name="priceTo" th:value="${priceTo}"/></td>
        </tr>
        <tr><td><input type="submit" value="検索"/></td></tr>
      </table>
    </form>
    <div th:if="${resultSize > 0}"><label th:text="${resultSize}"></label></div>
    <table border="1" th:if="${resultSize > 0}">
      <tr>
        <td>商品ID</td>
        <td>商品名</td>
        <td>価格</td>
      </tr>
      <tr th:each="data : ${result}">
        <td th:text="${data.goodsId}"/>
        <td th:text="${data.goodsName}"/>
        <td th:text="${data.price}"/>
      </tr>
    </table>
  </body>
</html>

Entityファイル

package jp.classmethod.entity;

import java.math.BigDecimal;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.validation.constraints.NotNull;

import lombok.Getter;
import lombok.Setter;

@Entity
@Table(name="goods_mst")
public class Goods {

  @Id
  @Column(name="goods_id")
  @Getter
  @Setter
  private String goodsId;

  @Column(name="goods_name")
  @Getter
  @Setter
  private String goodsName;

  @NotNull
  @Getter
  @Setter
  private BigDecimal price;

}

Repositoryファイル

package jp.classmethod.repository;

import org.springframework.data.jpa.repository.JpaRepository;

import jp.classmethod.entity.Goods;

public interface GoodsRepository extends JpaRepository<Goods, String> {
}

Serviceファイル

package jp.classmethod.service;

import java.math.BigDecimal;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import jp.classmethod.entity.Goods;
import jp.classmethod.repository.GoodsRepository;
import jp.classmethod.repository.GoodsRepositoryCustom;

@Service
public class GoodsService {

  @Autowired
  GoodsRepository repository;

  public List<Goods> search(String goodsId, String goodsName, BigDecimal priceFrom, BigDecimal priceTo) {
    List<Goods> result;
      result = repository.findAll();
    return result;
  }

}

Controllerファイル

package jp.classmethod.controller;

import java.math.BigDecimal;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import jp.classmethod.entity.Goods;
import jp.classmethod.service.GoodsService;

@ComponentScan
@Controller
@RequestMapping("/goods")
public class GoodsController {

  private static final String VIEW = "/goods";

  @Autowired
  public GoodsService service;

  @RequestMapping(method = RequestMethod.GET)
  public String index() {
    return VIEW;
  }

  @RequestMapping(method = RequestMethod.POST)
  public ModelAndView login(ModelAndView mav
      , @RequestParam("goodsId") String goodsId, @RequestParam("goodsName") String goodsName
      , @RequestParam("priceFrom") BigDecimal priceFrom, @RequestParam("priceTo") BigDecimal priceTo) {
    mav.setViewName(VIEW);
    mav.addObject("goodsId", goodsId);
    mav.addObject("goodsName", goodsName);
    mav.addObject("priceFrom", priceFrom);
    mav.addObject("priceTo", priceTo);
    List<Goods> result = service.search(goodsId, goodsName, priceFrom, priceTo);
    mav.addObject("result", result);
    mav.addObject("resultSize", result.size());
    return mav;
  }

}

Application.ymlファイル

spring:
  datasource:
    url: jdbc:mysql://localhost/javatest?useSSL=true
    username: root
    password: Infra2013
    driverClassName: com.mysql.jdbc.Driver

  jpa:
    hibernate:
      show-sql: true
      ddl-auto: update
    database-platform: org.hibernate.dialect.MySQLDialect

  thymeleaf:
    enabled: true
    cache: false

  messages:
    basename = messages
    cache-seconds = -1
    encoding = UTF-8

  endpoints:
    enabled: true

logging:
    level:
        org:
            hibernate:
                SQL: DEBUG
                type:
                    descriptor:
                        sql:
                            BasicBinder: TRACE

ログから取得したSQL文

select goods0_.goods_id as goods_id1_0_, goods0_.goods_name as goods_na2_0_, goods0_.price as price3_0_ from goods_mst goods0_ 
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

記載されたController/Service/RepositoryならびにSpringBootの設定を適用しましたが、私の環境では特に問題なくクエリが実行され、その結果(全件)が出力されました。

org.hibernate.SQL                        : select goods0_.goods_id as goods_id1_0_, goods0_.goods_name as goods_na2_0_, goods0_.price as price3_0_ from goods_mst goods0_

(Controllerは @RestControllerに変更して実行)

念のため、SpringBoot関連で動作しているライブラリのバージョンを見直すと良いでしょうか。
(私は、SpringBoot-1.5.9で検証しています。それ以外はSpringBoot-1.5.9のmanagedバージョンです)

余談ですが、記載されているHTML(thymeleaf)と実際に実行されるControllerにて、POST送信時ではすべてのパラメータが必須入力なのに対し、Serviceクラス以降では特にそれらのパラメータを一切使っていませんね。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/09 22:57

    pom.xmlをしらべましたが、私もSpringbootの1.5.9を利用しています。しかも、Eclipseのビルド・パスにあるMaven依存関係もSpringBoot-1.5.9.jarを利用しています。

    ### pom.xml
    ```
    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>jp</groupId>
    <artifactId>classmethod</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>search</name>
    <description>Demo project for Spring Boot</description>

    <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.9.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
    </properties>

    <dependencies>
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
    </dependency>
    <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
    </dependency>
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
    </dependency>
    </dependencies>

    <build>
    <plugins>
    <plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    </plugin>
    </plugins>
    </build>


    </project>
    ```
    >余談ですが、記載されているHTML(thymeleaf)と実際に実行されるControllerにて、POST送信時ではすべてのパラメータが必須入力なのに対し、Serviceクラス以降では特にそれらのパラメータを一切使っていませんね。

    そうです。取りあえず、正常に動けるかどうかをテストする段階です。

    キャンセル

  • 2018/01/10 00:57

    原因をようやくわかりました。データの問題です。mysqlをテストするとき、自動コミットをOFFしましたのが原因です。コミットする前に、mysqlのクライアント側もDBViewerも参照できますが、SpringBootがこのようなデータを認めなさそうです。

    キャンセル

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

  • ただいまの回答率 90.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Java

    14388questions

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