2014-05-14 1 views
1

다음 JPA criteria 쿼리는 Hibernate (4.2.7 final)에서 성공합니다.EclipseLink가 스칼라 부울 값을 가져 오지 못함

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 ?)) 

같은 쿼리는 경우 에 아무것도 반환하지 않습니다 (2.5.1) (NO 오류, 예외없이)는 EclipseLink에 실패합니다. 그러나 다음과 같이 올바른 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에서 부울 값을 지정하지 않습니까?

답변

2

이는 EclipseLink 버그 https://bugs.eclipse.org/bugs/show_bug.cgi?id=340089이 원인인데, 이는 EclipseLink가 SQL 쿼리에서 반환 된 값을 내부적으로 사용하여 결과가 없음을 구별하지 못하게하기 때문입니다. 다른 값을 선택하는 것만이 유일한 해결책이지만 많은 사람들이 충돌하지 않거나 버그를 언급하거나 투표하지 않고 해결할 정도로 간단합니다.

관련 문제