JPA和JPQLMEMBEROF查询总是返回空结果



我在JPA2/Hibernate 4.2/MySQL5.1/Java 6 上遇到问题

我有下面的类User,它有一个属性Set<Role>,其中Role是一个枚举。这是类别:

@Entity
public class User
{
  private static final long serialVersionUID = 1L;
  @ElementCollection(fetch=FetchType.EAGER)
  @Enumerated(value=EnumType.STRING)
  protected Set<Role> roles;
  // .. other stuff
}
public enum Role { ADMIN, OPERATOR, ... }

我已经尝试为此创建CriteriaQuery和JPQL查询,但由于某种原因,即使角色存在,它们每次都返回一个空列表。

这是我的条件查询代码:

CriteriaBuilder builder = getEntityManager().getCriteriaBuilder();
CriteriaQuery<User> query = builder.createQuery(User.class);
Root<User> root = query.from(User.class);
query.where(builder.isMember( Role.ADMIN, root.<Set<Role>>get( "roles" ) ) );
List<User> result = getEntityManager().createQuery(query).getResultList();

这是我正在创建的JPQL:

String jpql = "SELECT * FROM com.mypackage.user.User WHERE (:roles1 MEMBER OF roles))";
Query query = em.createQuery(jpql);
query.setParameter( "roles1", Role.ADMIN );
List result = em.getResultList();

users表包含一个具有所有角色的用户,但这两个用户都没有返回任何结果。对于我正在做的工作,我需要同时拥有JPA和JPQL版本。请帮忙!

好吧,对于有类似问题的人,我有一个解决方案,但不是很好。感谢JB Nizet的指点,因为他们帮助诊断了问题。

这个问题是由于JPA和/或Hibernate在处理非字符串数据时的限制。在这里,我使用了一个枚举,它在数据库中对Role对象及其字符串表示形式进行相等性测试,而不是将我传入的Role转换为其数据库表示形式(正如您所期望的那样),然后进行比较。

为了让JPQL版本继续运行,我做了:

String jpql = "SELECT * FROM com.mypackage.user.User WHERE (:roles1 MEMBER OF roles))";
Query query = em.createQuery(jpql);
query.setParameter( "roles1", Role.ADMIN.toString() );
List result = em.getResultList();

为了修复JPA版本,我做了:

CriteriaBuilder builder = getEntityManager().getCriteriaBuilder();
CriteriaQuery<User> query = builder.createQuery(User.class);
Root<User> root = query.from(User.class);
query.where(builder.isMember( Role.ADMIN.toString(), root.<Set<String>>get( "roles" ) ) );
List<User> result = getEntityManager().createQuery(query).getResultList();

如果有人能纠正这个代码,使其不需要toString(我没有排除我只是没有正确设置它的想法),如果你能纠正我的错误,我将不胜感激。:)

相关内容

  • 没有找到相关文章

最新更新