我试图使用本机查询将多个表中的联接值检索到自定义POJO中。我要检索的值之一是JSONB字段。虽然我能够获得具有该字段的实体,但当我将其强制输入自定义POJO时,我得到了一个org.hibernate.MappingExcema: No Dialect映射for JDBC type: 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”自定义方言映射是这样实现的。我从这里得到的@sqlresultsetmap。现在,我尝试使用自定义映射进行查询:
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();
我意识到,当我使用自定义的SqlResultsMapping注释时,hibernate无法识别类型定义。我该怎么解决?请注意,我不能使用TypedQueries,因为我的实际查询非常复杂,无法用JPA查询语法处理。如果有必要,我可以在github上上传一个示例项目。
我设法修好了。事实证明,您需要告诉SqlResultsMapping中的每一列它应该表示的类型。对于字段类MyJson的Jsonb字段,需要使用自定义用户类型类“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注释处理的。
我尝试使用的将本机SQL查询映射到POJO类,如下所示: 然后,为了在创建本机查询时使用声明的结果集映射,我通过它的名称引用它: 但这对我不起作用,我得到以下错误:
问题内容: 我有一个带有本地查询的Spring Data Repository方法 并且我想将结果映射到Non-Entity POJO 。 是否可以,如果可以,请提供示例吗? 问题答案: 假设在Orid的答案中使用GroupDetails,您是否尝试过JPA 2.1 @ConstructorResult? 并在存储库界面中使用以下命令: 根据springJPA的数据文件,spring将首先尝试找到
并且我希望将结果映射到非实体POJO。 是否可能?如果可能,请提供一个例子?
我有这个实体: 读取字段位于另一个表中,因此我将其设置为瞬态,以防止JPA映射错误。为了检索实体的内容,我想使用如下所示的本机查询: 问题是,我不知道如何将本机查询映射到实体。特别是,我不知道EntityManager是否会忽略@Transient字段。请帮忙。
我有一个场景,我想把从JPA存储库中的本机查询中提取的数据映射到自定义对象。 我的存储库代码如下: 我的自定义类代码如下: 但是我在运行应用程序时遇到了以下错误 原因:org。springframework。数据地图。PropertyReferenceException:找不到类型优惠券的属性FindTodayPoffer! 我应该移动名称查询和sql结果映射到我的实体类吗?问题是我不想污染我的实