【问题标题】:Converting VARCHAR to numeric in sql在sql中将VARCHAR转换为数字
【发布时间】: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


【解决方案1】:

你可以使用@Convert注解在java对象字段和sql字段之间进行转换:

 @Enumerated(EnumType.STRING)
 @Convert(converter = RatingConverter.class)
 private Rating rating;
@Component
@Converter(autoApply=true)
public class RatingConverter extends AbstractAttributeConverter<Rating, Integer> {

    @Override
    public BigDecimal convertToDatabaseColumn(Rating rating) {
        // TODO
    }

    @Override
    public Rating convertToEntityAttribute(Integer dbData) {
        // TODO
    }

}

您需要在RatingConverter中实现上述2个方法,以根据您的业务逻辑转换字段。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-16
    • 2021-03-26
    • 2011-12-31
    • 2018-04-19
    • 2011-02-01
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多