如何使用springboot在jpa repository @Query中为PostgreSQL更改json的字符串值

x8goxv8g  于 2023-11-20  发布在  Spring
关注(0)|答案(2)|浏览(159)

Maven pom依赖:

<dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <scope>runtime</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.json/json -->
        <dependency>
            <groupId>org.json</groupId>
            <artifactId>json</artifactId>
            <version>20230227</version>
        </dependency>

字符串
配置方言:

spring:
  jpa:
    properties:
      hibernate:
        dialect: org.hibernate.dialect.PostgreSQLDialect
    show-sql: 'true'
    hibernate:
      ddl-auto: update


我有以下实体:

@Entity
@Data
@Getter
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Slf4j
public class CourseEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @Column(columnDefinition = "json")
    private String list_id_professors;
}


SqlCourseRepository文件:

import jakarta.transaction.Transactional;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import java.util.Optional;

@Repository
public interface SqlCourseRepository extends JpaRepository<CourseEntity, Integer>, JpaSpecificationExecutor {
    //multiple criteria: JpaSpecificationExecutor

    @Transactional
    @Modifying
    @Query("update CourseEntity set list_id_professors = :list_id_professors where id = :id")
    Integer updateCourseListIdProfessors(@Param(value = "id") Integer id, @Param(value = "list_id_professors") String list_id_professors);
    // If okk -> integer = num rows affected. 0 if no changes. -1 if error.
}


我有一个PostgreSQL数据库:
Postgresql Database Field Initial Value
如果我想更新JSON字段,我可以在数据库内部的SQL查询工具上执行:
第一个月
Postgresql Database Field Updated Value
我的问题是如何在SqlCourseRepository上做到这一点。
因为我不能在变量后面加上“::json”
Error adding "::json"
另外,另一种可能性是在Entity的属性定义上使用一个JSON int[]变量。但我有另一个问题,因为我不知道如何做到这一点:
Error changing type to "Integer[]"
所以我不知道如何把一个SQL查询,可以与PostgreSQL数据库正确交互

xam8gpfp

xam8gpfp1#

你可以尝试转义::操作符,如下所示:

@Query("update CourseEntity set list_id_professors = :list_id_professors \\:\\:json where id = :id", nativeQuery = true)

字符串

pdkcd3nj

pdkcd3nj2#

解决方案是编辑将要执行JpaRepository的SQL命令的值。为此,必须添加字段“value”和“nativeQuery”字段。此外,必须将“::json”更改为CAST才能正常工作。
而不是:

@Query("update CourseEntity set list_id_professors = :list_id_professors where id = :id")

字符串
变更为:

@Query(value = "update course_entity set list_id_professors = CAST(:list_id_professors AS json) where id = (:id);", nativeQuery = true)


完整的解决方案:

@Transactional
@Modifying
@Query(value = "update course_entity set list_id_professors = CAST(:list_id_professors AS json) where id = (:id);", nativeQuery = true)
Integer updateCourseListIdProfessors(@Param(value = "id") Integer id, @Param(value = "list_id_professors") String list_id_professors);
// If okk -> integer = num rows affected. 0 if no changes. -1 if error.


重要的是要补充:
1-由于它的原生SQL命令而不是JPA解释的,我们必须将CourseEntity更改为posytgresql列的名称course_entity
2-参数的名称**必须与期望@Param值的名称100%**一致

相关问题