Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用JPA和Hibernate使用映射为序号的枚举参数进行查询_Java_Hibernate_Jpa_Enums_Hibernate Mapping - Fatal编程技术网

Java 如何使用JPA和Hibernate使用映射为序号的枚举参数进行查询

Java 如何使用JPA和Hibernate使用映射为序号的枚举参数进行查询,java,hibernate,jpa,enums,hibernate-mapping,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 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();
}

当您将枚举设置为序号时,在查询中应该使用序号。榜样

@Transactional
public List<Shop> findByType(String type) {
    return sessionFactory.getCurrentSession().createQuery("from Shop where type=" + ShopType.valueOf(type).ordinal()).list();
}
ShopType.valueOf(type)
,仅当字符串类型与枚举名称相同时,此选项才有效。 另外,若您的标签和枚举名相同,那个么您不需要标签。
ShopType.VANS.name()
等于
“VANS”
,并且
name()
方法是最终的,您可以确保它不能被重写。

只需将字符串转换为枚举并使用命名查询参数即可

@Transactional
public List<Shop> findByType(String type) {
    ShopType enumType = shopTypeFromString(type);
    return sessionFactory.getCurrentSession().createQuery("from Shop where type=:p_type")
        .setParameter("p_type", enumType).list();
}

private ShopType shopTypeFromString(String type) {
    // You can implement this convertion in your own way
    return ShopType.valueOf(type);
}
@Transactional
公共列表findByType(字符串类型){
ShopType enumType=shopTypeFromString(类型);
返回sessionFactory.getCurrentSession().createQuery(“从类型为:p_类型的商店”)
.setParameter(“p_类型”,enumType).list();
}
private ShopType shopTypeFromString(字符串类型){
//您可以用自己的方式实现此转换
return ShopType.valueOf(type);
}

查询中的问题是,您连接了bind参数值,这除了会导致问题外,还可能使应用程序暴露于

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

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());
Hibernate将在SQL查询中正确使用序号值:

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
]

对于一个工作示例,请查看in my.

结果应取决于接收findByType方法的type param,您只需硬编码VANS type我猜这不好=)
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());
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
]