我正在编写一个非常简单的查询,它只查询具有给定状态的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>
答案 0 :(得分:0)
我在一个特定的应用程序中遇到同样的问题。
该hibernate的根本原因是忽略@Enumerated注释并始终将枚举传递给sql VARBINARY