EclipseLink无法获取标量布尔值

时间:2014-05-14 09:51:27

标签: mysql jpa eclipselink criteria jpa-2.1

以下JPA条件查询在Hibernate(4.2.7 final)上成功。

CriteriaBuilder criteriaBuilder=entityManager.getCriteriaBuilder();
CriteriaQuery<Boolean>criteriaQuery=criteriaBuilder.createQuery(Boolean.class);
Root<UserTable> root = criteriaQuery.from(entityManager.getMetamodel().entity(UserTable.class));
criteriaQuery.multiselect(root.get(UserTable_.enabled));

ParameterExpression<String>parameterExpression=criteriaBuilder.parameter(String.class);
criteriaQuery.where(criteriaBuilder.equal(criteriaBuilder.lower(criteriaBuilder.trim(root.get(UserTable_.emailId))), criteriaBuilder.lower(criteriaBuilder.trim(parameterExpression))));
List<Boolean> list = entityManager.createQuery(criteriaQuery).setParameter(parameterExpression, "admin").getResultList();

for(Boolean o:list)
{
    System.out.println("enabled : "+o);
}

它只是意味着从MySQL数据库返回一个标量布尔值。相应的列在MySQL中的类型为TINYINT(1)

它生成以下SQL语句。

SELECT
    usertable0_.enabled as col_0_0_ 
FROM
    social_networking.user_table usertable0_ 
WHERE
    lower(trim(BOTH FROM usertable0_.email_id))=lower(trim(BOTH FROM ?))

相同的查询在EclipseLink(2.5.1)上失败,在这种情况下它什么都不返回(没有错误,没有异常)。但是,它会生成正确的SQL语句,如下所示。

SELECT enabled 
FROM projectdb.user_table
WHERE (LOWER(TRIM(email_id)) = LOWER(TRIM(?)))

bind => [admin]

相应的JPQL就像这样,

SELECT u.enabled 
FROM UserTable u 
WHERE lower(trim(u.emailId))=lower(trim(:emailId))

也没有得到有问题的价值。


然而,它可以使用其他列,如下所示。

CriteriaBuilder criteriaBuilder=entityManager.getCriteriaBuilder();
CriteriaQuery<Object[]>criteriaQuery=criteriaBuilder.createQuery(Object[].class);
Root<UserTable> root = criteriaQuery.from(entityManager.getMetamodel().entity(UserTable.class));
criteriaQuery.multiselect(root.get(UserTable_.enabled), root.get(UserTable_.firstName));

ParameterExpression<String>parameterExpression=criteriaBuilder.parameter(String.class);
criteriaQuery.where(criteriaBuilder.equal(criteriaBuilder.lower(criteriaBuilder.trim(root.get(UserTable_.emailId))), criteriaBuilder.lower(criteriaBuilder.trim(parameterExpression))));
List<Object[]> list = entityManager.createQuery(criteriaQuery).setParameter(parameterExpression, userName).getResultList();

添加了一个额外的列root.get(UserTable_.firstName),并且CriteriaQuery的返回类型已从CriteriaQuery<Boolean>更改为CriteriaQuery<Object[]>

该列在相应的实体中定义如下。

@Basic(optional = false)
@NotNull
@Column(name = "enabled")
private Boolean enabled;  //Getter and setter.

为什么它在EclipseLink中没有给出布尔值?

1 个答案:

答案 0 :(得分:2)

这是由于EclipseLink错误https://bugs.eclipse.org/bugs/show_bug.cgi?id=340089导致EclipseLink无法区分SQL查询返回的值与内部使用的构造,以指示没有结果。选择另一个值是唯一的解决方法,但它似乎很简单,没有多少人点击它或只是解决它没有评论或投票的错误。