当你不需要 addScalar
在您的示例中,您实际上并不需要使用addScalar
.
如果将响应映射到 DTO,如下所示EmployeeDTO
:
public class EmployeeDTO {
private final Long id;
private final String name;
private final Double salary;
public EmployeeDTO(Long id, String name, Double salary) {
this.id = id;
this.name = name;
this.salary = salary;
}
public Long getId() {
return id;
}
public String getName() {
return name;
}
public Double getSalary() {
return salary;
}
}
然后,以下 SQL 查询可以获取EmployeeDTO
就好了:
List<EmployeeDTO> employeeDTOs = entityManager
.createNativeQuery(
"SELECT " +
" emp_id AS id, " +
" emp_name AS name, " +
" emp_salary AS salary " +
"FROM employee ")
.getResultList();
请注意,我们使用了列别名,以便 Hibernate 可以匹配我们想要设置的 DTO 属性。
当你需要 addScalar
假设您有一个具有 JSON属性的Book
实体:properties
@Entity(name = "Book")
@Table(name = "book")
@TypeDef(typeClass = JsonNodeBinaryType.class, defaultForType = JsonNode.class)
public static class Book {
@Id
@GeneratedValue
private Long id;
@NaturalId
private String isbn;
@Column(columnDefinition = "jsonb")
private JsonNode properties;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getIsbn() {
return isbn;
}
public void setIsbn(String isbn) {
this.isbn = isbn;
}
public JsonNode getProperties() {
return properties;
}
public void setProperties(JsonNode properties) {
this.properties = properties;
}
}
由开源项目JsonNodeBinaryType
提供。hibernate-types
现在,当执行获取 JSONproperties
列的本机 SQL 查询时:
JsonNode properties = (JsonNode) entityManager
.createNativeQuery(
"SELECT properties " +
"FROM book " +
"WHERE isbn = :isbn")
.setParameter("isbn", "978-9730228236")
.getSingleResult();
Hibernate 抛出以下异常:
org.hibernate.MappingException: No Dialect mapping for JDBC type: 1111
这是因为 Hibernate 不知道如何将jsonb
列转换为JsonNode
Java 对象,因为它缺少 Hibernate-native JSON Type
。
但是如果我们调用addScalar
并提供 Hibernate Type
:
JsonNode properties = (JsonNode) entityManager
.createNativeQuery(
"SELECT properties " +
"FROM book " +
"WHERE isbn = :isbn")
.setParameter("isbn", "978-9730228236")
.unwrap(org.hibernate.query.NativeQuery.class)
.addScalar("properties", JsonNodeBinaryType.INSTANCE)
.getSingleResult();
然后查询将运行得很好!