【发布时间】:2017-12-14 01:56:21
【问题描述】:
Spring Data JPA 引入了一个不错的功能,"query by example" (QBE)。您可以通过构造实体的实例来表达您的搜索条件。
您不必编写 JPQL。它比repository query derivation 使用更少的“魔法”。语法很好。它可以防止琐碎的存储库代码爆炸。它可以很好地经受重构。
但有一个问题:QBE 仅在您可以部分构造一个对象时才有效。
这是我的实体:
@Entity
@Table(name="product")
data class Product(
@Id val id: String,
val city: String,
val shopName: String,
val productName: String,
val productVersion: Short
)
这是我的存储库(空!这是 QBE 的一个好东西):
@Repository
interface ProductRepository : JpaRepository<Product, String>
以下是获取List<Product> 的方法——在某个城市的某个商店出售的所有产品:
productRepository.findAll(Example.of(Product(city = "London", shopName="OkayTea")))
或者至少,这是我想要做的。有问题。 不可能构造这个对象:
Product(city = "London", shopName="OkayTea")
这是因为Product 的构造函数要求所有 定义它的字段。确实:这就是我大部分时间想要的。
Java 中通常的折衷方案是:使用无参数构造函数构造实体,使所有内容可变,不保证完整性。
有没有很好的 Kotlin 模式来解决这个问题:
- 一般要求所有参数都在构造时实例化
- 提供还一些机制来生成部分构造的实例以与示例 API 一起使用
诚然,这些看起来完全是相互矛盾的目标。但也许还有另一种方法可以解决这个问题?
例如:也许我们可以制作一个模拟/代理对象,它看起来是一个产品,但没有相同的构造约束?
【问题讨论】:
-
数据类不可能,如果你想保留数据类给你的所有好东西。