【发布时间】:2020-10-26 08:31:27
【问题描述】:
任何人都可以帮助将值的字符串表示形式转换为 sql 中的 int。 例如,我在 sql 表中有 'FIVE' varchar 字段,我需要使用 sql 查询将其转换为 5。 至少可以只使用 sql 来做到这一点。
是否可以在 CriteriaAPI 中实现。
主要目标是将所有字符串字段转换为数字表示并找到平均值 每个产品 ID。
实体:
@Entity
@Table(name = "product_review")
public class ProductReview {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "prod_rev_seq")
private Long id;
@ManyToOne(optional = false)
@JoinColumn(name = "prod_id")
private Product product;
@Enumerated(EnumType.STRING)
private Rating rating;
}
@Entity
@Table(name = "product")
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "prod_seq")
@Column(name = "prod_id")
private Long id;
@OneToMany(mappedBy = "product", fetch = FetchType.LAZY,
private Set<ProductReview> productReviews = new HashSet<>();
}
public enum Rating implements JsonDeserializableEnum {
ONE(BigDecimal.ONE, "Horrible", BigDecimal.ZERO, BigDecimal.valueOf(1.5)),
ONE_AND_HALF(BigDecimal.valueOf(1.5), "Poor", BigDecimal.valueOf(1.5), BigDecimal.valueOf(2)),
TWO(BigDecimal.valueOf(2), "Poor", BigDecimal.valueOf(2), BigDecimal.valueOf(2.5)),
TWO_AND_HALF(BigDecimal.valueOf(2.5), "Below average", BigDecimal.valueOf(2.5), BigDecimal.valueOf(3)),
THREE(BigDecimal.valueOf(3), "Average", BigDecimal.valueOf(3), BigDecimal.valueOf(3.5)),
THREE_AND_HALF(BigDecimal.valueOf(3.5), "Average", BigDecimal.valueOf(3.5), BigDecimal.valueOf(4)),
FOUR(BigDecimal.valueOf(4), "Good", BigDecimal.valueOf(4), BigDecimal.valueOf(4.5)),
FOUR_AND_HALF(BigDecimal.valueOf(4.5), "Very good", BigDecimal.valueOf(4.5), BigDecimal.valueOf(5)),
FIVE(BigDecimal.valueOf(5), "Excellent", BigDecimal.valueOf(5), BigDecimal.valueOf(5.5));
}
'五' - 5
'三个' - 3
等
提前致谢!
【问题讨论】:
-
在您的情况下,您只需选择具有 RATING 字符串表示的产品评论,然后为每个执行
Rating.valueOf()以获取匹配的枚举条目,然后获取其数字表示。这一切都会发生在记忆中。另一种方法 - 在数据库端创建存储过程,但这不是最好的方法。如果您可以选择更改数据库结构,也许最好将评级存储为数字? Hibernate 提供了很好的功能,称为转换器。@Convert, '@Converter',因此您将能够管理持久/检索上的枚举条目所发生的事情
标签: java sql spring hibernate criteria