jpa查询似乎没有正确解析枚举值,并始终返回空列表

时间:2013-12-27 06:22:51

标签: java mysql jpa persistence enumeration

我正在编写一个非常简单的查询,它只查询具有给定状态的Foo对象,但我得到的结果总是一个空列表,但我真的不知道我的代码有什么问题。

我的findByStatus方法如下所示:

public List<Foo> findByStatus(final Status status, final int startIndex, final int maxRows)
{
    List<Foo> foos= getJpaTemplate().executeFind(new JpaCallback()
    {
        @Override
        public Object doInJpa(EntityManager entityManager) throws PersistenceException
        {
            Query q = entityManager.createQuery("SELECT f FROM Foo f WHERE f.status = :status", Foo.class);
            q.setParameter("status", status);    //This will not automatically resolve???
            q.setFirstResult(startIndex).setMaxResults(maxRows);
            return q.getResultList();
        }
    });

    return foos == null ? Collections.EMPTY_LIST : foos;
}

但是,如果我(1)取出Foo.class(entityManager.createQuery中的第二个参数和(2)改为q.setParameter("status", status.name()),那么我将获得正确的结果列表。

有谁知道这里有什么问题?

顺便说一句,我的Foo类看起来像这样:

public class Foo
{
  @Enumerated(EnumType.STRING) @Column(nullable=false, columnDefinition = "VARCHAR(10) DEFAULT 'ON'")
  private Status status= Status.ON;

  //other fields
}

状态如下

public enum Status
{
  ON("ON"),
  OFF("OFF"),
  UNKNOWN("UNKNOWN");

  private String status;

  private Status(String status)
  {
     this.status = status;
  }

  public String getStatus()
  {
     return status;
  }
}

所以看起来hibernate将我的枚举值绑定到一些VARBINARY,这很奇怪:

2013-12-27 11:38:35,341 TRACE [org.hibernate.type.descriptor.sql.BasicBinder]  - <binding parameter [1] as [VARBINARY] - ON>

1 个答案:

答案 0 :(得分:0)

我在一个特定的应用程序中遇到同样的问题。

该hibernate的根本原因是忽略@Enumerated注释并始终将枚举传递给sql VARBINARY