2

我能够存储、检索和查询具有枚举类型的实体(使用 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)
4

4 回答 4

2

绝对地。只需使用query.setString("param", "BUSINESS_%");. 请注意,当 Hibernate 尝试将其强制转换为枚举时,使用setParameter()而不是抛出 ClassCastException,但它完全符合您的要求。setString()setString()

于 2012-05-31T00:17:13.623 回答
0

据说 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) ...

于 2014-02-02T10:50:02.300 回答
0

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

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

它适用于 Hibernate 和 Eclipselink。

但是不要尝试使用pattern用户输入,因为以这种方式构造查询容易受到 sql 注入攻击。

于 2014-09-18T08:37:44.737 回答
0

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

  • 定义到同一 db 列的第二个属性映射
  • 该属性的类型是 String
  • 它既不可更新也不可插入
  • 适配枚举属性的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);
于 2021-03-21T11:59:22.343 回答