Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 查询的JPA和JPQL成员始终返回空结果_Hibernate_Jpa_Persistence_Jpql_Criteriaquery - Fatal编程技术网

Hibernate 查询的JPA和JPQL成员始终返回空结果

Hibernate 查询的JPA和JPQL成员始终返回空结果,hibernate,jpa,persistence,jpql,criteriaquery,Hibernate,Jpa,Persistence,Jpql,Criteriaquery,我在JPA2/Hibernate 4.2/MySQL 5.1/Java 6方面遇到问题 我有下面的类User,它有一个属性Set,其中Role是一个枚举。下面是课堂: @Entity public class User { private static final long serialVersionUID = 1L; @ElementCollection(fetch=FetchType.EAGER) @Enumerated(value=EnumType.STRING) pro

我在JPA2/Hibernate 4.2/MySQL 5.1/Java 6方面遇到问题

我有下面的类User,它有一个属性Set,其中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, ... }

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

好吧,对于那些有类似问题的人,我有一个解决方案,但不是很好。感谢JB Nizet在帮助诊断问题时提供的提示

问题是由于JPA和/或Hibernate在处理非字符串数据时的限制。在这里,我使用了一个枚举,它在数据库中的角色对象和它的字符串表示之间做一个相等测试,而不是像您期望的那样将我传入的角色转换为它的db表示,然后进行比较

为了让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,我没有排除我只是没有正确设置它的想法,如果您能纠正我,我将不胜感激

生成的SQL是什么?当您直接执行这个生成的SQL时会发生什么?我已经更改了jpql,所以它现在进行计数-hibernate本机SQL给出:select col_0_0_0_从用户user0_何处开始?在中,从用户角色角色角色1中选择角色1角色,其中用户0\u0.id=角色1\u0.User\u id-如果我更改?对于“ADMIN”,它可以工作。SQL看起来是正确的。尝试查看哪个值实际绑定到语句,自己在数据库上执行查询,检查数据,并检查您是否连接到了正确的数据库。但不确定这是否正确-我本来希望从用户user0中选择count*as col\u 0\u 0\u,如果我更改生成的SQL,那么?替换为“ADMIN”,我得到了预期的结果。角色enum只是一个简单的enum,即我没有更改toString或name方法,所以我猜hibernate也在ADMIN中进行交换,除非它失败。
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();
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();