El método JpaRepository findAll() devuelve un resultado vacío. Estoy tratando de implementar el servicio de descanso usando Spring-boot, la base de datos h2 y jpa.
Aquí está mi 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`)); Mi archivo data.sql incluye:
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'); La entidad de la 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; } } La interfaz 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(); } Y aquí está mi clase de Contoller
@RestController @RequestMapping("/city") public class CityController { @Autowired private CityRepository cityRepository; @RequestMapping(method = RequestMethod.GET, value = "/all") public List<City> getAllCityList(){ return cityRepository.findAll(); } }¿Qué estoy haciendo mal aquí? La documentación de referencia: Spring doc
Tiene un schema.sql y un data.sql que se ejecutan después de que el origen de DataSource se haya configurado y esté listo. A continuación, se crea EntityManagerFactory y, de forma predeterminada (consulte la guía de referencia ), create-drop la base de datos para los tipos incrustados (como H2).
Puede anular este comportamiento cambiando la propiedad spring.jpa.hibernate.ddl-auto a cualquier otra cosa y luego create o create-drop .
Otra solución es cambiar el nombre de data.sql a import.sql , que se ejecutará después de que Hibernate haya creado el esquema por usted. Obviamente, ahora también puede eliminar schema.sql , ya que Hibernate creará el esquema.
Si esto es para fines de aprendizaje, debería estar bien, si desea usar esto en un sistema de producción en vivo, sugiero que en lugar de usar esto use algo como Flyway para administrar su esquema.
Este es un código de muestra que funciona para mí:
@DataJpaTest @TestPropertySource(properties = { "spring.datasource.schema=classpath:/sql/schema.sql", "spring.datasource.data=classpath:/sql/data.sql", "spring.jpa.hibernate.ddl-auto=none" }) class CalculatorRepositoryTest implements WithAssertions { @Autowired private CalculatorRepository repository; @Test void testAutoConfiguration() { assertThat(repository).isNotNull(); } @Test void testInsertResult() { Result newResult = new Result(); newResult.setOperation(OperationType.DIVISION.name()); newResult.setValue(10); Result insertedResult = repository.save(newResult); assertAll( () -> assertThat(insertedResult).isNotNull(), () -> assertThat(insertedResult.getId()).isEqualTo(5L), () -> assertThat(insertedResult.getOperation()).isEqualTo(OperationType.DIVISION.name()), () -> assertThat(insertedResult.getValue()).isEqualTo(10) ); } @Test void testSelectAllResults() { List<Result> results = repository.findAll(); assertAll( () -> assertThat(results).isNotEmpty(), () -> assertThat(results.get(0).getOperation()).isEqualTo(OperationType.ADDITION.name()), () -> assertThat(results.get(0).getValue()).isEqualTo(5) ); } } schema.sql
CREATE TABLE result( id INT PRIMARY KEY AUTO_INCREMENT NOT NULL, operation VARCHAR(50) NOT NULL, value INT ); data.sql
INSERT INTO result(id, operation, value) VALUES(1, 'ADDITION', 5); INSERT INTO result(id, operation, value) VALUES(2, 'SUBTRACTION', 14); INSERT INTO result(id, operation, value) VALUES(3, 'MULTIPLICATION', 10); INSERT INTO result(id, operation, value) VALUES(4, 'DIVISION', 3); En primer lugar, no necesita anular el método findAll() . Ya está disponible en su interfaz.
Mientras configura su archivo schema.sql y data.sql , lo primero que debe hacer es establecer esta propiedad spring.jpa.hibernate.ddl-auto en none , para evitar que hibernate cree el esquema por usted.
spring.datasource.schema=classpath:/sql/schema.sql spring.datasource.data=classpath:/sql/data.sql Aquí mis archivos sql están en esta ubicación: test/resources/sql . De lo contrario, de forma predeterminada, no necesita esas configuraciones si pone su archivo en test/resources
Puedes encontrar muy buenos detalles en este post .