如何查询多个列,但并非所有具有@Query的列,但仍使用域数据模型与Spring Data JDBC映射



我的数据模型是

 @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)

您至少现在不能。

有三种解决方案,您已经指出了两个解决方案:

  1. 使用, NULL as <column-name>扩展您的SELECT STACTION。

    我不确定

    是否

    ,但这仍将以空值序列化整个对象。

意味着这在某种程度上对您不起作用。

  1. 指定RowMapper
  2. 您可以使用恰好包含查询返回的字段的类。如果您想要正常实体和部分实体

你写:

但是,弹簧数据的全部点JDBC是为了避免POJO的数据模型和数据库架构之间的紧密耦合。

这不是很正确。弹簧数据JDBC的一个重要目标是没有实体和表行之间的运行时间连接。这将需要代理或类似,并带来很多复杂性。但是,由于JPA中可用的所有映射变体都会带来复杂性,因此实体和表之间的结构映射可能会更强(当然是现在)。春季数据JDBC的主要目标是概念上比JPA更简单。

您也问

为什么EntityRowMapper不只是将null映射到不是查询的一部分的属性?

我不确定我是否在编码它时是否会积极考虑它,但是我不喜欢默认为NULL的想法,因为这会使您很容易意外地不加载列,因为您在别名中有错字。

,但我不反对其他解决方案。如果您有想法,请创建一个功能请求。

相关内容

最新更新