EAV模型Spring数据jpa上的java复杂选择
我有一个如下的产品实体(它是简单的版本)
@Entity
@Table(name = "product")
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
@OneToMany(mappedBy = "product")
private List<ProductAtt> attributes;
}
每个产品可以有一个或多个属性。属性如下所示
@Entity
@Table(name = "attribute")
public class Attribute {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
private String name;
}
因此,我创建了一个关系实体,如下所示,具有额外的值属性
@Entity
@Table(name = "product_att")
public class ProductAtt implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
@ManyToOne
@JoinColumn
private Product product;
@ManyToOne
@JoinColumn
private Attribute attribute;
private int value;
}
现在我想找到所有具有自定义值的属性的产品。例如,属性1的值为3,属性2的值为40和
最简单、最有效的查询是什么
# 1 楼答案
由于要查询的属性数量在设计时未知,因此必须使用Spring Data JPA支持的动态查询机制之一。查询当然可以使用JPA规范或标准API构建
如果使用QueryDSL支持,则可以使用带有
exists
的子查询。下面的示例显示了如何做到这一点(假设Java 8和QueryDSL 4)应该注意的是,数据库的设计必然会出现性能问题,因为同一个表(
ProductAttr
)包含的次数与搜索属性的次数一样多。这不是QueryDSL、JPA、Hibernate、SQL或数据库服务器的问题,而是数据模型本身(也称为EAV模型)的问题