使用LIKE运算符对具有枚举(EnumType.STRING)的实体执行JPA查询

rqmkfv5c  于 11个月前  发布在  其他
关注(0)|答案(5)|浏览(103)

我能够使用枚举类型(使用JPA/Hibernate)存储、检索和查询实体。枚举字段用@Enumerated(EnumType.STRING)注解。
有没有可能做像"SELECT a FROM MyEntity a WHERE a.myEnum LIKE :param"这样的事情?
这个想法是让它匹配任何实体,其中枚举值字符串(在DB中)匹配像“SYSTEM_%”或“BUSINESS_%"这样的模式。
谢谢你帮忙

  • 更新:
    当我试着用这个查询时:
`@Query("SELECT e FROM MyEntity e WHERE e.myEnum LIKE :value")`

字符串
使用值(表示匹配任何......):
%%
我得到这个例外:

Caused by: java.lang.IllegalArgumentException: Parameter value [%%] did not match expected type [mypackage.MyEntity$MyEnum]
        at org.hibernate.ejb.AbstractQueryImpl.validateParameterBinding(AbstractQueryImpl.java:370)
        at org.hibernate.ejb.AbstractQueryImpl.registerParameterBinding(AbstractQueryImpl.java:343)
        at org.hibernate.ejb.QueryImpl.setParameter(QueryImpl.java:374)
        at org.hibernate.ejb.QueryImpl.setParameter(QueryImpl.java:71)

1aaf6o9v

1aaf6o9v1#

当然可以。只要使用query.setString("param", "BUSINESS_%");。注意,使用setParameter()而不是setString()会抛出ClassCastException,因为Hibernate试图将其转换为枚举,但是setString()确实可以做到这一点。

ruarlubt

ruarlubt2#

我遇到了同样的问题,我做了以下事情:

  • 定义到同一数据库列的第二个属性Map
  • 该属性的类型为String
  • 它既不可更新也不可插入
  • 调整enum属性的set方法
  • 使String属性为只读属性
@Column(name = "status")
    @Enumerated(EnumType.STRING)
    private StatusEnum status;

    public void setStatus(StatusEnum status) {
        this.status = status;
        this.statusString = status.toString();
    }
    
    @Column(name ="status", updatable = false, insertable = false)
    private String statusString;

字符串
现在你可以使用“like”对statusString进行查询:

TypedQuery<MyEntity> query = 
    em.createQuery("select e from MyEntity e where e.statusString like 'CLOSED%', MyEntity.class);

cld4siwp

cld4siwp3#

saidly在org.springframework.orm.hibernate3.HibernateTemplate中有一个快捷方式:

protected void applyNamedParameterToQuery(Query queryObject, String paramName, Object value)
        throws HibernateException {

    if (value instanceof Collection) {
        queryObject.setParameterList(paramName, (Collection) value);
    }
    else if (value instanceof Object[]) {
        queryObject.setParameterList(paramName, (Object[]) value);
    }
    else {
        queryObject.setParameter(paramName, value);
    }
}

字符串
如果有一个额外的else if(value instanceoff String),则会更好.

9udxz4iz

9udxz4iz4#

作为一种解决方法,您可以通过将模式连接到查询来构建查询。

em.createQuery("SELECT e FROM MyEntity e WHERE e.myEnum LIKE '" + pattern +"'")

字符串
它可以与Hibernate和Eclipse Link一起使用。
但是,不要尝试使用从用户输入生成的pattern,因为以这种方式构造查询容易受到sql注入攻击。

jjjwad0x

jjjwad0x5#

上面的答案都不适合我,尽管我设法找到了适合我的解决方案,而且它非常简单-你只需将Enum转换为String:

@Query("SELECT a FROM MyEntity a WHERE CAST(a.myEnum AS string) LIKE %?1%")
    List<MyEntity> findByParam(String param);

字符串
其中“?1”是参数

相关问题