如何使用JPA和Hibernate使用映射为ORDINAL的Enum参数进行查询

use*_*896 5 java enums hibernate jpa 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的DAO类中,我有一个方法,它返回jsp页面上所选类型的对象列表.在jsp页面上我发送选定的值String,是不是?

那怎么看我的方法

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

我不知道如何创建正确的查询.Enum i存储在我的数据库中,如tinyint.

这是一个模型.

@Column(name = "type")
@Enumerated(EnumType.ORDINAL)
private ShopType type;
Run Code Online (Sandbox Code Playgroud)

Pet*_*vic 7

当你将enum设置为序数时,那么在查询中你应该使用序数.例;

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

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

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

ShopType.valueOf(type),这仅在字符串类型与枚举名称相同时才有效.此外,如果您的标签与枚举名称相同,那么您不需要标签. ShopType.VANS.name()是等于"VANS"name()方法是最终的,你可以肯定不能被覆盖.


Vla*_*cea 5

您查询中的问题是您连接了绑定参数值,这除了导致您的问题之外,还可能使您的应用程序暴露于SQL 注入攻击

如果您使用绑定参数值编写查询:

Post post = entityManager.createQuery(
    "select p " +
    "from Post p " +
    "where p.status = :status", Post.class)
.setParameter("status", PostStatus.PENDING)
.getSingleResult();

assertEquals("High-Performance Java Persistence", post.getTitle());
Run Code Online (Sandbox Code Playgroud)

Hibernate 将在 SQL 查询中正确使用 ORDINAL 值:

Query:["
    select 
        p.id as id1_0_,
        p.status as status2_0_, 
        p.title as title3_0_ 
    from 
        post p 
    where 
        p.status=?
"], 
Params:[
    0
]
Run Code Online (Sandbox Code Playgroud)

有关工作示例,请查看EnumOrdinalTest我的high-performance-java-persistenceGitHub 存储库中的