JPA2: Без учета регистра, как и в любом месте

Я использовал ограничения гибернации в JPA 1. 0 (драйвер гибернации). Определен Restrictions.ilike ("столбец", "ключевое слово", MatchMode.ANYWHERE) , который проверяет, соответствует ли ключевое слово в любом месте столбцу и не учитывает регистр.

Теперь я использую JPA 2.0 с EclipseLink в качестве драйвера, поэтому мне приходится использовать встроенный JPA 2.0 «Ограничения». Я нашел CriteriaBuilder и метод , например , я также узнал, как сделать так, чтобы он соответствовал где угодно (хотя это ужасно и вручную), но все же я не понял, как это сделать он нечувствителен к регистру.

Вот мое текущее ужасное решение:

CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<User> query = builder.createQuery(User.class);
EntityType<User> type = em.getMetamodel().entity(User.class);
Root<User> root = query.from(User.class);

// Where   
// important passage of code for question  
query.where(builder.or(builder.like(root.get(type.getDeclaredSingularAttribute("username", String.class)), "%" + keyword + "%"),
        builder.like(root.get(type.getDeclaredSingularAttribute("firstname", String.class)), "%" + keyword + "%"),
        builder.like(root.get(type.getDeclaredSingularAttribute("lastname", String.class)), "%" + keyword + "%")
        ));

// Order By
query.orderBy(builder.asc(root.get("lastname")),
            builder.asc(root.get("firstname")));

// Execute
return em.createQuery(query).
            setMaxResults(PAGE_SIZE + 1).
            setFirstResult((page - 1) * PAGE_SIZE).
            getResultList();

Вопросы:

Есть ли какая-нибудь функция, как в драйвере Hibernate?

Правильно ли я использую критерии JPA 2.0? Это неудобное и неудобное решение по сравнению с ограничениями гибернации.

Или кто-нибудь может мне помочь, как изменить решение, чтобы оно не учитывало регистр, пожалуйста?

Большое спасибо.

47
задан Sean Patrick Floyd 2 January 2011 в 20:18
поделиться