我不知道如何使用 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) 我正在使用新的 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)
有没有办法在这个模块中使用分页?
我尝试在 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
我正在尝试将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 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 在插入查询中忽略它,但它不适用于更新
我正在尝试在新的反应式数据 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
我正在阅读有关预测的内容,但似乎无法找出在 …
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 的使用?
我正在使用 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
我的示例代码基于 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
由于 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 集合的处理发生在不同的线程中)?