java - 如何使用 JPA 和 Hibernate 使用映射为 ORDINAL 的枚举参数进行查询

标签 java hibernate jpa enums hibernate-mapping

我需要通过枚举类型从数据库中获取数据。 我有以下枚举:

public enum ShopType {
    VANS("VANS"), ATTICUS("ATTICUS"), FAMOUS("FAMOUS")

    ShopType(String label) {
        this.label = label;
    }

    private String label;

    public String getLabel() {
        return label;
    }

    public void setLabel(String label) {
        this.label = label;
    }
}

在我的 DAO 类中,我有一个方法,它按 jsp 页面上的选定类型返回对象列表。在 jsp 页面上,我发送选定的值,例如 String,对吗?

我的方法看起来怎么样

@Transactional
public List<Shop> findByType(String type) {
    return sessionFactory.getCurrentSession().createQuery("from Shop where type=" + .....  .list();
}

我不知道如何创建正确的查询。我像 tinyint 一样存储在我的数据库中的枚举。

这是一个模型。

@Column(name = "type")
@Enumerated(EnumType.ORDINAL)
private ShopType type;

最佳答案

当您将枚举设置为序数时,那么在查询中您应该使用序数。示例;

@Transactional
public List<Shop> findByType(String type) {
    return sessionFactory.getCurrentSession().createQuery("from Shop where type=" + ShopType.valueOf(type).ordinal()).list();
}

如果您更改@Enumerated(EnumType.STRING),那么您的查询将如下所示;

@Transactional
public List<Shop> findByType(String type) {
    return sessionFactory.getCurrentSession().createQuery("from Shop where type=" + ShopType.valueOf(type).name()).list();
}

ShopType.valueOf(type),这仅在字符串类型与枚举名称相同时有效。 此外,如果您的标签与枚举名称相同,则您不需要标签。 ShopType.VANS.name()等于"VANS"并且name()方法是final的,你可以确定不能覆盖。

关于java - 如何使用 JPA 和 Hibernate 使用映射为 ORDINAL 的枚举参数进行查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26106557/

相关文章:

java - 如何优化或更改 hibernate 生成的 SQL 语句

java spring 4 hibernate 5 两个实体管理器上下文错误

java - 如何修复 org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl@779de014 is closed 问题

sql - 在Spring数据JPA查询中检查List参数是否为空

java - 针对 WAR 运行测试

java - Java 中的 SecureRandom 安全种子

mysql - JPA 如何将 ElementCollection 表的列类型设置为 BLOB

java - 在域模型中的 JPA 拼写灾难的上下文中天真地使用 java 枚举的序号

Java - 从两个 ArrayLists/Array 中查找重复项的优化方法

java - Tomcat maven 插件 - 无法加载类 "org.slf4j.impl.StaticLoggerBinder"