如何使用Spring webflux & R2dbc在Java代码中查询jsonb数据类型(Postgresql)

n6lpvg4x  于 2023-02-16  发布在  Spring
关注(0)|答案(1)|浏览(190)

我有以下结构的postgresql数据库

CREATE TABLE products (
    id bigserial,
    name varchar(30) NOT NULL,
    owner_id bigint,
    pdata jsonb NOT NULL,
    PRIMARY KEY (id)
);

此处pdata的数据类型为jsonb
pdata示例(jsonb数据类型)

"facility": {
    "parent": {
      "type": "City"
    },
    "facilityId": "Z00TRIZR6KAQ6"
  }
}

我从PGadmin运行下面的查询,它工作正常。我得到了想要的结果

from techwriting.products
where pdata ->'facility' ->'parent'->>'type'='City'
and pdata ->'facility' ->>'facilityId'='Z00TRIZR6KAQ6';

上面的查询基本上是检查jsonb值中的各种属性并给出结果。
我正在使用Spring WebFlux和R2dbc在Java代码中运行相同的查询。我能够在Java中得到相同的响应。
型号等级

@Builder
@NoArgsConstructor
@AllArgsConstructor
@Table("products")
public class Product {

  @Id
  private Long id;

  private String name;

  private  String pdata;

  @Column("owner_id")
  private long ownerId;

}

存储库类

import com.maersk.jsonb.model.Product;
import org.springframework.data.r2dbc.repository.Query;
import org.springframework.data.repository.reactive.ReactiveCrudRepository;
import reactor.core.publisher.Flux;

public interface ProductRepository extends ReactiveCrudRepository<Product, Long> {

  @Query(value="select * from techwriting.products where pdata ->'facility' ->'parent'->>'type'='City' and pdata ->'facility' ->>'facilityId'='Z00TRIZR6KAQ6'")
  Flux<Product> findAllByName();
}

响应:我们收到以下响应。响应正确,记录数量相同。

[
    {
        "id": 1,
        "name": "xyz",
        "pdata": "{\"facility\": {\"parent\": {\"type\": \"BBSR\"}, \"facilityId\": \"Z00TRIZR6KAQ6\"}}",
        "ownerId": 2
    }
]

我的问题是:
1.在仓库类中@Query包含了所有硬编码的值。如何动态地做这些?
1.响应包含pdata作为字符串。但是存储在postgresql中的json数据和我得到的结构是不同的。
postgresql中的pdata(jsonb类型):

{
  "facility": {
    "parent": {
      "type": "BBSR"
    },
    "facilityId": "Z00TRIZR6KAQ6"
  }
}

得到回应:

"{\"facility\": {\"parent\": {\"type\": \"BBSR\"}, \"facilityId\": \"Z00TRIZR6KAQ6\"}}"

我们如何将String转换为如上所示的存储在db中的?

9gm1akwq

9gm1akwq1#

我对Q1的回答。

@Query(value="select * from techwriting.products where pdata ->'facility' ->'parent'->>'type'=$1 and pdata ->'facility' ->>'facilityId'=$2")
  Flux<Product> findAllByfacilityIdandtype(String type, String facilityId);

相关问题