如何在OneToMany关系中仅检索一条记录?

时间:2020-08-14 11:17:01

标签: jpa

我有两个实体,产品和价格。每个产品应只有1个有效价格。

产品:

@Entity
@Table(name = "product")
public class Product implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
    @SequenceGenerator(name = "sequenceGenerator")
    private Long id;

    @NotNull
    @Column(name = "name", nullable = false)
    private String name;

    // getter and setters
}

价格:

@Entity
@Table(name = "product_price")
public class ProductPrice implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
    @SequenceGenerator(name = "sequenceGenerator")
    private Long id;

    @NotNull
    @Column(name = "price", nullable = false)
    private Float price;

    @NotNull
    @Column(name = "active", nullable = false)
    private Boolean active;

    @ManyToOne
    @JsonIgnoreProperties(value = "productPrices", allowSetters = true)
    private Product product;

    // getter and setters
   }

我想在我的产品类中添加一个价格字段,以便知道当前价格。当前价格基本上是将active设置为true的价格条目。

我知道如何在Product实体上添加OneToMany关系,但这将为我提供所有价格。有什么办法让它只检索“活动”的价格?

1 个答案:

答案 0 :(得分:0)

是的,您可以根据活动列检索单个记录。
您需要使用@Where(clause = "active = 'true'")

@Entity
@Table(name = "product")
public class Product implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
    @SequenceGenerator(name = "sequenceGenerator")
    private Long id;

    @NotNull
    @Column(name = "name", nullable = false)
    private String name;
    
    @OneToMany(mappedBy = "product")
    @Where(clause = "active = 'true'")
    @JsonFormat(with = JsonFormat.Feature.WRITE_SINGLE_ELEM_ARRAYS_UNWRAPPED) // this will give you object structure instead of list
    Set<ProductPrice> price;

    // getter and setters
}

注意:请从@Where(clause = "active = 'true'")@Where(clause = "active = true")中查看哪个在为您工作。

@JsonFormat(with = JsonFormat.Feature.WRITE_SINGLE_ELEM_ARRAYS_UNWRAPPED),这将为您提供对象结构而不是列表。 如下所示。

{

}

如果您不希望将单个记录作为列表返回,如下所示。

[{

}]