【问题标题】:JPA native query mapping POJO class with JSONB value on PostgreSQLPostgreSQL 上具有 JSONB 值的 JPA 本机查询映射 POJO 类
【发布时间】:2017-04-29 22:39:00
【问题描述】:

我试图使用本机查询将多个表中的连接值检索到自定义 POJO 中。我要检索的值之一是 JSONB 字段。虽然我能够获得具有该字段的实体,但当我将其强制到自定义 POJO 中时,我得到一个“org.hibernate.MappingException:JDBC 类型的无方言映射: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”自定义方言映射的实现类似于this。 我从here 得到的@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 上上传示例项目。

【问题讨论】:

  • 看看这个教程:thoughts-on-java.org/…
  • 这就是我最初使用的(我什至链接了它)。问题是,一旦我使用 SqlResultSetMapping,就无法识别自定义方言。
  • 我正在处理类似的问题。看到这个:stackoverflow.com/questions/61371808/… 只是一个问题,你在哪里实现@SqlResultSetMapping,在你的存储库中?

标签: java postgresql hibernate jpa jsonb


【解决方案1】:

我设法修复它。事实证明,您需要告诉 SqlResultSetMapping 中的每一列它应该代表哪种类型。对于字段类 MyJson 的 Jsonb 字段,您需要使用自定义 UserType 类 'MyJsonType' (Implementation on this Site)。这看起来像这样:

@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 注释处理的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-02
    • 1970-01-01
    • 2019-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-14
    • 1970-01-01
    相关资源
    最近更新 更多