我的数据模型是
@Getter
@Setter
public class Customer {
@Id private ID id;
@CreatedDate protected Instant createdAt;
@LastModifiedDate protected Instant updatedAt;
@CreatedBy protected String createdBy;
@LastModifiedBy protected String updatedBy;
@Version protected Long version;
private UUID orderId;
private String offer;
}
我的存储库是
public interface CustomerRepository extends CrudRepository<Customer, UUID> {
@Query(
"SELECT ID, Offer FROM Customer WHERE orderId = :orderId ")
List<Customer> findCustomerByOrderId(
@Param("orderId") UUID orderId);
}
这将导致一个例外说'orderId column not found [42122-190]'
。因此,Spring希望您始终查询所有列。我知道,对于JPA,我们在实体和数据模式之间进行了强大的映射。但是,弹簧数据的全部点JDBC避免了POJO的数据模型和数据库模式之间的紧密耦合。为什么EntityRowMapper不只是将NULL
映射到不是查询的一部分的属性呢?
有没有办法告诉使用的RowMapper,可以忽略不是查询的一部分的属性?为这些简单查询创建单独的RowMapper
似乎是很多不必要的工作。
我仍然可以通过更改查询(例如
)来解决此问题@Query(
"SELECT ID, Offer, OrderId, null as CreatedAt, null as CreatedBy, null as UpdatedAt, null as UpdatedBy, null as Version FROM Customer WHERE orderId = :orderId ")
,但这仍会用无效值序列化整个对象。我在这里错过了明显的东西吗?
注意这不是弹簧数据JPA。它的弹簧数据JDBC。
编辑进一步研究它,例外是来自H2数据库lib。
Caused by: org.h2.jdbc.JdbcSQLException: Column "orderid" not found [42122-190]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:345)
at org.h2.message.DbException.get(DbException.java:179)
at org.h2.message.DbException.get(DbException.java:155)
at org.h2.jdbc.JdbcResultSet.getColumnIndex(JdbcResultSet.java:3129)
at org.h2.jdbc.JdbcResultSet.get(JdbcResultSet.java:3217)
at org.h2.jdbc.JdbcResultSet.getObject(JdbcResultSet.java:522)
at com.zaxxer.hikari.pool.HikariProxyResultSet.getObject(HikariProxyResultSet.java)
at org.springframework.data.jdbc.core.EntityRowMapper.readFrom(EntityRowMapper.java:127)
您至少现在不能。
有三种解决方案,您已经指出了两个解决方案:
-
使用
, NULL as <column-name>
扩展您的SELECT STACTION。我不确定
是否,但这仍将以空值序列化整个对象。
意味着这在某种程度上对您不起作用。
- 指定
RowMapper
。 - 您可以使用恰好包含查询返回的字段的类。如果您想要正常实体和部分实体。
你写:
但是,弹簧数据的全部点JDBC是为了避免POJO的数据模型和数据库架构之间的紧密耦合。
这不是很正确。弹簧数据JDBC的一个重要目标是没有实体和表行之间的运行时间连接。这将需要代理或类似,并带来很多复杂性。但是,由于JPA中可用的所有映射变体都会带来复杂性,因此实体和表之间的结构映射可能会更强(当然是现在)。春季数据JDBC的主要目标是概念上比JPA更简单。
您也问
为什么EntityRowMapper不只是将null映射到不是查询的一部分的属性?
我不确定我是否在编码它时是否会积极考虑它,但是我不喜欢默认为NULL
的想法,因为这会使您很容易意外地不加载列,因为您在别名中有错字。
,但我不反对其他解决方案。如果您有想法,请创建一个功能请求。