다음 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에서 부울 값을 지정하지 않습니까?