web-dev-qa-db-ja.com

JpaRepository findAll()は空の結果を返します

JpaRepositoryfindAll()メソッドは空の結果を返します。 Spring-boot、h2データベース、jpaを使用してRESTサービスを実装しようとしています。

これが私のschema.sql

CREATE TABLE IF NOT EXISTS `City` (
  `city_id` bigint(20) NOT NULL auto_increment,
  `city_name` varchar(200) NOT NULL,
PRIMARY KEY (`city_id`));

僕の data.sqlファイルに含まれるもの:

INSERT INTO City (city_id,city_name) VALUES(1,'EDE');
INSERT INTO City (city_id,city_name) VALUES(2,'DRUTEN');
INSERT INTO City (city_id,city_name) VALUES(3,'DELFT');

Cityエンティティ:

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "City")
public class City {

  @Id
  @GeneratedValue
  @Column(name = "city_id")
  private Long cityId;

  @Column(name = "city_name")
  private String cityName;

  public Long getCityId() {
    return cityId;
  }

  public void setCityId(Long cityId) {
    this.cityId = cityId;
  }

  public String getCityName() {
    return cityName;
  }

  public void setCityName(String cityName) {
    this.cityName = cityName;
  }

}

JpaRepositoryインターフェース:

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface CityRepository extends JpaRepository<City, Long> {

    @Override
    List<City> findAll();
}

そして、これが私のContollerクラスです

@RestController
@RequestMapping("/city")
public class CityController {
    @Autowired
    private CityRepository cityRepository;

    @RequestMapping(method = RequestMethod.GET, value = "/all")
    public List<City> getAllCityList(){
        return cityRepository.findAll();
    }
}

私はここで何が間違っているのですか?リファレンスドキュメント: Spring doc

5
fiskra

schema.sqldata.sqlがあり、どちらもDataSourceが構成され、準備ができた後に実行されます。次に、EntityManagerFactoryが作成され、デフォルトで( リファレンスガイド を参照)、これは組み込み型(H2など)のデータベースをcreate-dropします。

spring.jpa.hibernate.ddl-autoプロパティをcreateまたはcreate-drop以外の値に変更することで、この動作をオーバーライドできます。

もう1つの解決策は、data.sqlの名前をimport.sqlに変更することです。これは、Hibernateがスキーマを作成した後に実行されます。 Hibernateがスキーマを作成するため、明らかにschema.sqlを削除することもできます。

これが学習目的である場合は問題ありません。ライブプロダクションシステムでこれを使用する場合は、これを使用する代わりに Flyway のようなものを使用してスキーマを管理することをお勧めします。

6
M. Deinum

私が理解している限り、アプリケーションの起動時にSQLスクリプトを実行し、その後Hibernateを使用しますか?さて、あなたは言及されたオプションの1つを使用する必要があります ここ そしてspring.jpa.hibernate.ddl-auto=noneを設定します。説明はそこに与えられます。

幸運を

0
Reborn

私の場合、削除された列はnullであり、JPAエンティティに@Where(clause = "deleted = 'false'")がありました。

0
Samuel Gwokuda