我的数据模型是
@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,我们在实体和数据模式之间建立了强大的映射关系。但是 Spring Data 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 ")
但这仍然会用空值序列化整个对象。我在这里遗漏了一些明显的东西吗?
注意这不是 Spring Data JPA。它的 Spring Data JDBC。
编辑 更深入地研究它,例外是来自 h2 数据库库。
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)