标签: spring-data-r2dbc

如何使用 Spring 中 R2dbc 提供的 Mono<Connection> 或 DatabaseClient 处理可为 null 的字段?

我不知道如何使用 spring-webflux (反应式)在 R2dbc (java)中构造有效的查询。使用 R2dbc 提供的 DatabaseClient 对象(或者 Connection 对象),我似乎只能调用这两种方法之一的不同变体:bind(Object field, Object value)bindNull(Object field, Class<?> type)。如果我有一个模式,以及 Java 中的相应类,具有多个可为 null 的字段,那么我应该如何[某种程度上]有效地处理这个问题?

举个例子:

public Flux<Item> saveOrUpdate(Item entity) {

   Mono<Connection> connection = this.connection; 

   Flux<? extends Result> itemFlux = connection
       .doOnError(e -> e.printStackTrace())
           .flatMapMany(connect  ->  connect.createStatement(INSERT_OR_UPDATE_ITEM)
                .bind("itemId", entity.getItemId()).returnGeneratedValues("itemid")
                .bind("auditId", entity.getTx().getId())
                .bind("itemNum", entity.getItemNum())
                .bind("itemCat", entity.getItemCat()) //nullable
                 // How would I know when to use this?
                .bindNull("sourcedQty", Integer.class) //nullable
                .bind("makeQty", entity.getMakeQty())
                .bind("nameShown", entity.getNameShown()) //nullable
                .bind("price", entity.price())
                .bind("dateCreated", entity.getDateCreated()) //nullable
                .add()
                .execute())... …
Run Code Online (Sandbox Code Playgroud)

java spring-data spring-webflux spring-data-r2dbc r2dbc

6
推荐指数
2
解决办法
5409
查看次数

Spring 数据 r2dbc 和分页

我正在使用新的 spring 数据 r2dbc 模块,并且能够使用 ReactiveCrudRepository 提取数据。现在我需要引入分页,但我无法做到。我试过这个

public interface TestRepository extends ReactiveCrudRepository<MyEntity, Long> {
    Flux<MyEntity> findByEntityId(Long entityId, Pageable page);
}
Run Code Online (Sandbox Code Playgroud)

但是当我尝试执行此操作时,我收到此错误

org.springframework.data.repository.query.ParameterOutOfBoundsException: Invalid parameter index! You seem to have declared too little query method parameters!
    at org.springframework.data.repository.query.Parameters.getParameter(Parameters.java:237)
    Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException: 
Run Code Online (Sandbox Code Playgroud)

有没有办法在这个模块中使用分页?

spring-data-r2dbc

6
推荐指数
2
解决办法
3885
查看次数

Spring Data R2dbc中处理表间关系的最佳实践

我尝试在 RDBMS 中创建用户/角色关系,并希望使用 R2dbc(Spring Data R2dbc) 与后端数据库握手。

假设有三个表,users、roles 和user_roles。

@Table("users")
class User {
    @Id
    private String username;

    private String password;

    private String email;

    @Builder.Default
    private boolean active = true;

    @Builder.Default
    private List<String> roles = new ArrayList<>();

    @Column("created_at")
    private LocalDateTime createdDate;

}
Run Code Online (Sandbox Code Playgroud)

与 JPA 不同,R2dbc 重用 spring-data-relational-common(在 Spring Data Jdbc 中也使用)来注释表,但没有解决关系的工具,例如roles此处。

postgresql spring-boot spring-data-jdbc spring-data-r2dbc r2dbc

6
推荐指数
1
解决办法
1106
查看次数

Spring 数据 R2DBC:org.springframework.data.mapping.PropertyReferenceException:找不到类型的属性 findAll

我正在尝试将ReactiveQuerydslPredicateExecutor和 R2dbcRepository 用于我的 spring-data-r2dbc 应用程序和 r2dbc-mssql 客户端版本 0.8.1.RELEASE

我将spring-boot版本从 2.2.7.RELEASE 升级到2.3.0.RELEASE并将spring-data-r2dbc版本从 1.0.0.RELEASE 升级到1.1.0.RELEASE。我正在使用 query-dsl 版本 4.3.1 来生成带有 apt-maven-plugin 的 Q-Classes。

进行这些更改后,当我运行我的应用程序时,出现以下错误。我一整天都在尝试,但找不到任何使它起作用的方法。有什么我想念的吗?

注意:如果我不进行上述更改并且不扩展存储库类中的 ReactiveQuerydslPredicateExecutor,则应用程序运行得非常好。

模型类

@Table(value = "db_access_schema.access_control")
@QueryEntity
public class AccessControl implements Persistable<UUID> {

  @Id
  private UUID id;
  private Long iub;
  private Long iubHeadOffice;
  private String bncId;
  private String subjectId;
  private String subjectTypeCd;
  private String subjectIdTypeCd;
  private String objectId;
  private String objectTypeCd;
  private String objectIdTypeCd;
  private String actionCd;
  private …
Run Code Online (Sandbox Code Playgroud)

spring-security querydsl spring-boot spring-data-r2dbc

6
推荐指数
1
解决办法
1129
查看次数

spring-r2dbc 中忽略更新字段

我正在使用 spring r2dbc 和 ReactiveCrudRepository,我有一个在生成更新查询时需要忽略的字段

@Data
@Table(PRODUCT_TABLE)
public class ProductEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO) // Id generated by database
    private Integer id;

    private Integer companyId;

    @Column(insertable=false, updatable = false)
    private String companyName;

    @NotBlank
    private String name;

    private VerificationStatus verificationStatus;
}
Run Code Online (Sandbox Code Playgroud)

如何在更新查询中忽略companyName。我可以使用 @column 在插入查询中忽略它,但它不适用于更新

java spring-webflux spring-data-r2dbc r2dbc

6
推荐指数
1
解决办法
4432
查看次数

如何将一对多/一对一映射到 Spring Data R2DBC 中的 POJO

我正在尝试在新的反应式数据 r2dbc 中复制我在 Spring Data JPA 中使用的一些功能。我知道 r2dbc 不是一个成熟的 ORM,但想了解在 r2dbc 中复制以下场景的最佳方法是什么:

public class Doctor extends BaseModel {

    //other fields and id

    @NotNull
    @Enumerated(EnumType.STRING)
    @ElementCollection(fetch = FetchType.LAZY, targetClass = Language.class)
    @CollectionTable(name = "doctor_language",
        joinColumns = @JoinColumn(name = "doctor_id"))
    @Column(name = "language")
    private List<Language> languages = new ArrayList<>();


    @OneToMany(fetch = FetchType.LAZY, targetEntity = DoctorHealthProvider.class, mappedBy = 
        "doctor")
    private List<DoctorHealthProvider> providers = new ArrayList<>();

    // other fields
}
Run Code Online (Sandbox Code Playgroud)

如果我使用 Spring Data JPA,对 DoctorRepository(它扩展 JpaRepository)的一个简单的 findById 调用会给我一个doctor对象,其中包含表中的语言doctor_language列表和表中的健康提供者列表health_provider

我正在阅读有关预测的内容,但似乎无法找出在 …

java spring spring-webflux spring-data-r2dbc r2dbc

6
推荐指数
1
解决办法
1276
查看次数

如何在 kotlin 中使用 spring data 和 r2dbc 映射类

org.springframework.r2dbc DatabaseClient 类已移至

import org.springframework.r2dbc.core.DatabaseClient;
Run Code Online (Sandbox Code Playgroud)

import org.springframework.data.r2dbc.core.DatabaseClient;
Run Code Online (Sandbox Code Playgroud)

Spring数据文档https://spring.io/projects/spring-data-r2dbc引用了一个简单的“as”方法来转换为对象

   databaseClient
        .sql("select * from reading")
        .as(CrepsReading::class.java)
        .fetch()
        .all()
        .asFlow()
Run Code Online (Sandbox Code Playgroud)

它不起作用。map(class) 也没有。只有映射类似乎有效。

     val all: Flux<CrepsReading> = databaseClient
            .sql("SELECT id, name FROM person")
            .map(CrepsReading::class)
            .fetch().all()
Run Code Online (Sandbox Code Playgroud)

如何简单地使用 spring-data-r2dbc (1.2.0) 映射对象?是否有文档描述了作为 spring-data-r2dbc 一部分的 DatabaseClient 的使用?

spring kotlin spring-data-r2dbc

6
推荐指数
1
解决办法
4221
查看次数

为什么会多次调用DB

我正在使用 Postgre SQL 来玩 R2DBC。我正在尝试的用例是通过 ID 以及语言、演员和类别获取电影。下面是架构

在此输入图像描述

这是ServiceImpl中对应的一段代码

@Override
public Mono<FilmModel> getById(Long id) { 
    Mono<Film> filmMono = filmRepository.findById(id).switchIfEmpty(Mono.error(DataFormatException::new)).subscribeOn(Schedulers.boundedElastic());
    Flux<Actor> actorFlux = filmMono.flatMapMany(this::getByActorId).subscribeOn(Schedulers.boundedElastic());
    Mono<String> language = filmMono.flatMap(film -> languageRepository.findById(film.getLanguageId())).map(Language::getName).subscribeOn(Schedulers.boundedElastic());
    Mono<String> category = filmMono.flatMap(film -> filmCategoryRepository
                    .findFirstByFilmId(film.getFilmId()))
            .flatMap(filmCategory -> categoryRepository.findById(filmCategory.getCategoryId()))
            .map(Category::getName).subscribeOn(Schedulers.boundedElastic());

    return Mono.zip(filmMono, actorFlux.collectList(), language, category)
            .map(tuple -> {
                FilmModel filmModel = GenericMapper.INSTANCE.filmToFilmModel(tuple.getT1());
                List<ActorModel> actors = tuple
                        .getT2()
                        .stream()
                        .map(act -> GenericMapper.INSTANCE.actorToActorModel(act))
                        .collect(Collectors.toList());
                filmModel.setActorModelList(actors);
                filmModel.setLanguage(tuple.getT3());
                filmModel.setCategory(tuple.getT4());
                return filmModel;
            });
         }
Run Code Online (Sandbox Code Playgroud)

日志显示 4 次调用拍摄

2021-12-16 21:21:20.026 DEBUG 32493 --- [ctor-tcp-nio-10] o.s.r2dbc.core.DefaultDatabaseClient     : Executing …
Run Code Online (Sandbox Code Playgroud)

project-reactor spring-webflux spring-data-r2dbc r2dbc r2dbc-postgresql

6
推荐指数
1
解决办法
1081
查看次数

Spring Data R2dbc 审计未按预期工作

我的示例代码基于 Spring Boot 2.4.0-M2(spring-data-r2dbc 1.2.0-M2)、Java 11、Postgres。

在 Spring 博客和更改日志中,它删除了 Spring Data R2dbc 获得了审计支持。

我像这样启用了审核。

@Configuration
@EnableR2dbcAuditing
class DataConfig {

    @Bean
    ReactiveAuditorAware<String> auditorAware() {
        return () -> Mono.just("hantsy");
    }
}
Run Code Online (Sandbox Code Playgroud)

以及实体类和存储库。

interface PersonRepository extends R2dbcRepository<Person, UUID> {
}

@Data
@ToString
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Table(value = "persons")
class Person {

    @Id
    @Column("id")
    private UUID id;

    @Column("first_name")
    private String firstName;

    @Column("last_name")
    private String lastName;

    @Column("created_at")
    @CreatedDate
    private LocalDateTime createdAt;

    @Column("updated_at")
    @LastModifiedDate
    private LocalDateTime updatedAt;

    @Column("version")
    @Version
    private Long version;

}
Run Code Online (Sandbox Code Playgroud)

架构脚本。(不用担心 UUID,在 docker …

postgresql spring-data spring-boot spring-webflux spring-data-r2dbc

5
推荐指数
0
解决办法
3953
查看次数

用于简单 RESTful 调用的响应式 R2DBC

由于 R2DBC 是反应式且非阻塞的,我想了解在简单的 RESTful CRUD 服务中使用 R2DBC 的好处

假设 Spring Boot 应用程序使用下面的存储库公开 RESTful 服务

public interface CustomerRepository extends ReactiveCrudRepository<Customer, Long> {

    @Query("SELECT * FROM customer WHERE last_name = :lastname")
    Flux<Customer> findByLastName(String lastName);

}
Run Code Online (Sandbox Code Playgroud)

该存储库是从服务调用的,结果需要在服务中进行转换,然后再返回到控制器。

Flux<Customer> customers = repository.findAll();
Run Code Online (Sandbox Code Playgroud)

为了访问完整的客户列表,我需要调用blockLast()Flux,这会使其阻塞并违背使用反应式组件的目的。

这是否意味着在这个简单的示例中使用 R2DBC 没有任何好处?我错过了什么吗?

Flux 是否只能用于异步订阅(其中 Flux 集合的处理发生在不同的线程中)?

project-reactor spring-data-r2dbc r2dbc

5
推荐指数
1
解决办法
695
查看次数