簡體   English   中英

PostgreSQL上具有JSONB值的JPA本機查詢映射POJO類

[英]JPA native query mapping POJO class with JSONB value on PostgreSQL

我試圖使用本機查詢將多個表中的聯接值檢索到自定義POJO中。 我要檢索的值之一是JSONB字段。 當我能夠使用該字段獲取實體時,當我將其強制進入自定義POJO時,會收到“ org.hibernate.MappingException:JDBC類型的No Dialect映射:1111”異常。 這是我使用的:

CREATE TABLE book (
  id BIGSERIAL NOT NULL PRIMARY KEY,
  data JSONB NOT NULL
);
CREATE TABLE price (
  book_id BIGSERIAL NOT NULL PRIMARY KEY,
  price NUMERIC(19,2) NOT NULL
);
INSERT INTO book (id, data) VALUES (0, '{"value": "someValue"}');
INSERT INTO price (book_id, price) VALUES (0, 10.00);

使用POJO:

@Entity
@TypeDef(defaultForType = MyJson.class, name = "MyJsonType", typeClass = MyJsonType.class)
@Data
@SqlResultSetMapping(name = "CustomMapping",
        classes = {
                @ConstructorResult(targetClass = CustomPOJO.class,
                        columns = {@ColumnResult(name = "id"),
                                @ColumnResult(name = "data"),
                                @ColumnResult(name = "price")})
        })
public class Book {

    @Id
    @GeneratedValue
    Long id;

    @Column(nullable = false, columnDefinition = "JSONB")
    MyJson data;
}

有了MyJson類:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class MyJson implements Serializable {

    private String value;
}

@Entity
@Data
@NoArgsConstructor
public class Price {

    @Id
    private Long id;
    private BigDecimal price;
}

還有我的自定義POJO

@AllArgsConstructor
@Data
public class CustomPOJO {

    private Long id;
    private MyJson data;
    private BigDecimal price;
}

這樣實現'@TypeDef'自定義方言映射。 我從這里得到的@SqlResultSetMapping。 現在,我嘗試使用自定義映射進行查詢:

String query = "SELECT id, data, price\n" +
               "FROM book, price\n" +
               "WHERE book.id = price.book_id;";
Query nativeQuery = em.createNativeQuery(query, "CustomMapping");
@SuppressWarnings("unchecked")
List<CustomPOJO> customPOJOS = nativeQuery.getResultList();

我意識到當我使用自定義SqlResultSetMapping批注時,hibernate無法識別類型定義。 我該如何解決? 請注意,我無法使用TypedQueries,因為我的實際查詢比JPA查詢語法要復雜得多。 如有必要,我可以在github上上傳一個示例項目。

我設法解決了。 事實證明,您需要告訴SqlResultSetMapping中的每一列它應該代表哪種類型。 對於字段類MyJson的Jsonb字段,您需要使用自定義UserType類'MyJsonType'( 在此站點上實現 )。 看起來像這樣:

@SqlResultSetMapping(name = "CustomMapping",
        classes = {
                @ConstructorResult(targetClass = CustomPOJO.class,
                        columns = {@ColumnResult(name = "id", type = Long.class),
                                @ColumnResult(name = "data", type = MyJsonType.class),
                                @ColumnResult(name = "price", type = BigDecimal.class)})
        })

顯然,您需要用於自定義pojo類的適當構造函數,在我的示例中,使用@AllArgsConstructor批注進行了處理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM