@SqlResultSetMapping 实体映射中引用的未知列
Posted
技术标签:
【中文标题】@SqlResultSetMapping 实体映射中引用的未知列【英文标题】:@SqlResultSetMapping unknown columns referenced in entity mapping 【发布时间】:2021-12-22 03:40:22 【问题描述】:我正在尝试使用原生 SQL 查询仅将某些字段映射到实体对象:
@NamedNativeQuery(name = "CustomerEntity.findOnlyNameAndPhoneFromCustomer", query = "select customer_name, customer_email from customer",
resultSetMapping = "nativeMapping")
@SqlResultSetMappings(value =
@SqlResultSetMapping(name = "nativeMapping",
entities =
@EntityResult(
entityClass = CustomerEntity.class,
fields =
@FieldResult(name = "name", column = "customer_name"),
@FieldResult(name = "email", column = "customer_email")
)))
@Entity
class CustomerEntity
//getter and setter fields
@Column(name="customer_name")
private String name;
@Column(name="customer_email")
private String email;
@Column(name="address")
private String adddress;
@Id
@GeneratedValue(generator = "uuid2")
@GenericGenerator(name = "uuid2", strategy = "uuid2")
@Access(AccessType.PROPERTY)
@Column(columnDefinition = "VARCHAR(36)", name = "customer_guid")
@Type(type = "uuid-char")
private UUID guid;
@Embedded
private AuditFields audit;
存储库:
@Query(nativeQuery = true)
List<CustomerEntity> findOnlyNameAndPhoneFromCustomer();
我不想将customer
表中存在的所有字段都映射到CustomerEntity
,我只是投影某些字段。
这给了我这样的错误:
17:44:37.841 [ERROR] o.h.e.j.s.SqlExceptionHelper - The column name address2_6_0_ is not valid.
我的表中没有名为address2_6_0_
的列,但是有一个名为address
的列,为什么这里要重命名和引用地址列?
我只引用customer_name
和customer_email
。
发生了什么事?
谢谢。
【问题讨论】:
您的查询为空! @Query(nativeQuery = true) @SimonMartinelli 它在@NamedNativeQuery
中
【参考方案1】:
entities
用于“映射到实体”。
@EntityResult
:
如果使用此注解,SQL 语句应选择映射到实体对象的所有列。
因此,您应该使用classes
和@ConstructorResult
来“映射到DTO”。
@NamedNativeQuery(name = "CustomerEntity.findOnlyNameAndPhoneFromCustomer",
query = "select customer_name, customer_email from customer",
resultSetMapping = "nativeMapping")
@SqlResultSetMappings(value =
@SqlResultSetMapping(name = "nativeMapping",
classes = @ConstructorResult(columns = @ColumnResult(name = "customer_name"), @ColumnResult(name = "customer_email") ,
targetClass = CustomerEntity.class)) )
@Entity
public class CustomerEntity
public CustomerEntity()
public CustomerEntity(String name, String email)
this.name = name;
this.email = email;
...
【讨论】:
这不是我想做的。使用@EntityResult
的全部意义在于我可以选择性地初始化某些列。并避免使用@ConstructorResult
。
我的观点是,如果不定义构造函数,就无法设置 DTO 变量。为什么我实际上不能使用其他方法(例如设置 DTO 值的 setter)
您可以使用ResultTransformer
。以上是关于@SqlResultSetMapping 实体映射中引用的未知列的主要内容,如果未能解决你的问题,请参考以下文章
Hibernate:使用@SqlResultSetMapping 映射本机查询的结果集
JPA 2.1 中的 @ConstructorResult 映射不能与 Hibernate 4.3.5.Final 一起正常工作
Hibernate SqlResultSetMapping 相同的结果重复而不是唯一