Spring Boot Query не обновляет базу данных mysql - PullRequest
1 голос
/ 27 сентября 2019

Обновление запроса не обновляет базу данных MySQL.Метод updateStatusTest выполняется и проходит тест, но когда я смотрю в базу данных, данные совпадают.Ниже приведен код, который я использовал:

mysql> SELECT * FROM spring_course_db.request;

+----+---------------------+-------------------------------------------+-------+----------------+----------+
| id | creation_date       | description                               | state | subject        | owner_id |
+----+---------------------+-------------------------------------------+-------+----------------+----------+
| 1  | 2019-09-24 20:03:28 | Pretendo obter um laptop HP, de RAM 16 GB | OPEN  | Novo Laptop HP | 1        |
+----+---------------------+-------------------------------------------+-------+----------------+----------+
1 row in set (0,01 sec)

The state show be IN_PROCESS.

RequestStageRepository

package com.spring.course.repository;

import java.util.List;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;

import com.spring.course.domain.Request;
import com.spring.course.domain.RequestStage;
import com.spring.course.enums.RequestState;

@Repository
public interface RequestStageRepository extends JpaRepository<RequestStage, Long>{

    public List<RequestStage> findAllByRequestId(Long id);

    @Query("UPDATE request SET state = :state WHERE id = :id")
    public Request updateStatus(Long id, RequestState state);

}

RequestRepositoryTests

package com.spring.course.repository;

import static org.assertj.core.api.Assertions.assertThat;

import java.util.Date;
import java.util.List;
import java.util.Optional;

import org.junit.FixMethodOrder;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.MethodSorters;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import com.spring.course.domain.Request;
import com.spring.course.domain.User;
import com.spring.course.enums.RequestState;

@FixMethodOrder(MethodSorters.NAME_ASCENDING)
@RunWith(SpringRunner.class)
@SpringBootTest
public class RequestRepositoryTests {

    @Autowired
    private RequestRepository requestRepository;

    @Test
    public void AsaveTest() {

        User owner = new User();

        owner.setId(1L);

        Request request = new Request(null, "Novo Laptop HP", "Pretendo obter um laptop HP", new Date(), RequestState.OPEN, owner, null);  

        Request createdRequest = requestRepository.save(request);

        assertThat(createdRequest.getId()).isEqualTo(1L);
    }

    @Test
    public void updateTest() {

        User owner = new User();

        owner.setId(1L);

        Request request = new Request(1L, "Novo Laptop HP", "Pretendo obter um laptop HP, de RAM 16 GB", null, RequestState.OPEN, owner, null);  

        Request updatedRequest = requestRepository.save(request);

        assertThat(updatedRequest.getDescription()).isEqualTo("Pretendo obter um laptop HP, de RAM 16 GB");
    }

    @Test
    public void getByIdTest() {

        Optional<Request> result = requestRepository.findById(1L);

        Request request = result.get();

        assertThat(request.getSubject()).isEqualTo("Novo Laptop HP");
    }

    @Test
    public void listTest() {

        List<Request> requests = requestRepository.findAll();

        assertThat(requests.size()).isEqualTo(1);
    }

    @Test
    public void listByOwnerIdTest() {

        List<Request> requests = requestRepository.findAllByOwnerId(1L);

        assertThat(requests.size()).isEqualTo(1);
    }

    @Test
    public void updateStatusTest() {

        int affectedRows = requestRepository.updateStatus(1L, RequestState.IN_PROCESS);
        assertThat(affectedRows).isEqualTo(1);  
        }
}

POM:

<?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>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.8.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.spring.course</groupId>
    <artifactId>spring-course2</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>
    <name>spring-course2</name>
    <description>Spring Boot</description>

    <properties>
        <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-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>

        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.13</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

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

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

</project>

1 Ответ

0 голосов
/ 27 сентября 2019

Либо собственный запрос на обновление, либо запрос на обновление JPQL просто возвращают int, который не содержит обновленных записей, а также они нуждаются в @Modifying аннотации Запросы на обновление

JPQL

@Modifying
@Query("update User u set u.status = :status where u.name = :name")
int updateUserSetStatusForName(@Param("status") Integer status, 
  @Param("name") String name);

Возвращаемое значение определяет, сколько строк обновляется при выполнении запроса.

Собственный

Вы можете изменить состояние базы данных также с помощью собственного запроса - нам просто нужно добавить аннотацию @Modifying

@Modifying
@Query(value = "update Users u set u.status = ? where u.name = ?", 
nativeQuery = true)

int updateUserSetStatusForNameNative (целочисленный статус, имя строки);

5.3.8.Изменение запросов из документации jpa данных весны с приведенным ниже примером

@Modifying
@Query("update User u set u.firstname = ?1 where u.lastname = ?2")
int setFixedFirstnameFor(String firstname, String lastname);

В случае, если вы хотите обновить запись на основе id и хотите вернуть обновленную запись, вы можете использовать метод сохранения

requestRepository.save(request)

Примечание: Убедитесь, что вы установили значения для всех свойств, в противном случае вы увидите null или значения по умолчанию

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...