Я разрабатываю веб-приложение, которое использует фреймворки JSF2 и JPA2.
Я начал использовать мастера на netbeans7.0, и «Новые страницы JSF из классов сущностей», создавшие classAbstractFacade, содержат этот полезный метод:
public List<T> findRange(int[] range) {
javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
cq.select(cq.from(entityClass));
javax.persistence.Query q = getEntityManager().createQuery(cq);
q.setMaxResults(range[1] - range[0]);
q.setFirstResult(range[0]);
return q.getResultList();
}
где T - класс сущностей, который содержит структуру базы данных таблицы, а переменная диапазона содержит два числа для получения подсписка результатов!
Теперь я изменяю его, чтобы установить порядок по выражению и проверяю, есть ли у пользователя диапазон или нет, и новый код:
public List<T> findRangeOrdered(int[] range, String orderBy) {
javax.persistence.criteria.CriteriaQuery<T> cq = (javax.persistence.criteria.CriteriaQuery<T>)getEntityManager().getCriteriaBuilder().createQuery();
cq.select(cq.from(entityClass));
javax.persistence.criteria.Root<T> r = cq.from(entityClass);
if(orderBy!=null && !orderBy.equals("")){
if(orderBy.ebdsWith(" desc"))
cq.orderBy(getEntityManager().getCriteriaBuilder().desc(r.get(orderBy.substring(0,orderBy.indexOf(" ")))));
else
cq.orderBy(getEntityManager().getCriteriaBuilder().desc(r.get(orderBy.substring(0,orderBy.indexOf(" ")))));
}
javax.persistence.Query q = getEntityManager().createQuery(cq);
if(range!=null)
{
q.setMaxResults(range[1] - range[0]);
q.setFirstResult(range[0]);
}
return q.getResultList();
}
Теперь я бы добавил кое-какие опции.
Я думаю о добавлении переменной List, которая может содержать HashMap с этими парой ключей -> значение:
- "type" -> тип поля, которое я буду искать (например, String.class или java.util.Date.class);
- "имя" -> имя поля в классе сущности;
- "value0" -> первое значение, которое я искал;
- "value1" -> второе значение для предложения "ween ";
- "предложение" -> какой фильтр я хочу использовать.
Теперь у меня есть некоторые сомнения:
1) эта идея хорошая идея?
2) сделать выход платформы, который уже реализует эту функцию?
3) если ответ на предыдущие вопросы: да, это хорошая идея; и нет, нет никакой структуры, которая уже делает это, я нахожу эти новые проблемы:
этот новый метод возвращает мне некоторые ошибки компилятора:
public List<T> findAllFiltered(int[] range, String orderBy, List<HashMap<String,Object>> whereList) {
List<Predicate> predicateList = new ArrayList<Predicate>();
String buf;
HashMap<String,Object> where;
int i=0;
javax.persistence.criteria.CriteriaQuery<T> cq = (javax.persistence.criteria.CriteriaQuery<T>)getEntityManager().getCriteriaBuilder().createQuery();
cq.select(cq.from(entityClass));
javax.persistence.criteria.Root<T> r = cq.from(entityClass);
javax.persistence.criteria.Path<T> path = cq.from(entityClass);
if(whereList!= null && whereList.size()>0){
Iterator iter=whereList.iterator();
Predicate p;
while (iter.hasNext())
{
where=(HashMap<String,Object>)iter.next();
if(where.get("where").toString().equals("like"))
p = getEntityManager().getCriteriaBuilder().like(getEntityManager().getCriteriaBuilder().upper(r.<String>get(where.get("name").toString())), "%"+where.get("value0").toString().toUpperCase()+"%");
else if(where.get("where").toString().equals("equal"))
p = getEntityManager().getCriteriaBuilder().equal(r.get(where.get("name").toString()), where.get("value0").toString());
else if(where.get("where").toString().equals("in"))
p = getEntityManager().getCriteriaBuilder().and(r.get(where.get("name").toString()).in(where.get("value0").toString().replaceAll("#",",")));
else if(where.get("where").toString().equals("between"))
{
java.util.Date value0=(java.util.Date)where.get("value0");
java.util.Date value1=(java.util.Date)where.get("value1");
p = getEntityManager().getCriteriaBuilder().between(r.<java.util.Date>get(where.get("name").toString()),value0,value1);
}
else if(where.get("where").toString().equals("greatest"))
p = getEntityManager().getCriteriaBuilder().and(getEntityManager().getCriteriaBuilder().greatest(r.<Long>get(where.get("name").toString())));
else if(where.get("where").toString().equals("greaterThanOrEqualTo"))
{
java.util.Date value0=(java.util.Date)where.get("value0");
p = getEntityManager().getCriteriaBuilder().greaterThanOrEqualTo(r.<java.util.Date>get(where.get("name").toString()),value0);
}
else if(where.get("where").toString().equals("lessThanOrEqualTo"))
{
java.util.Date value0=(java.util.Date)where.get("value0");
p = getEntityManager().getCriteriaBuilder().lessThanOrEqualTo(r.<java.util.Date>get(where.get("name").toString()),value0);
}
}
}
Predicate[] predicates = new Predicate[predicateList.size()];
predicateList.toArray(predicates);
cq.where(predicates);
if(orderBy!= null&& !orderBy.equals("")){
if(orderBy.endsWith("desc"))
cq.orderBy(getEntityManager().getCriteriaBuilder().desc(r.get(orderBy.substring(0,orderBy.indexOf(" ")))));
else
cq.orderBy(getEntityManager().getCriteriaBuilder().asc(r.get(orderBy.substring(0,orderBy.indexOf(" ")))));
}
javax.persistence.Query q = getEntityManager().createQuery(cq);
if(range!=null){
q.setMaxResults(range[1] - range[0]);
q.setFirstResult(range[0]);
}
return q.getResultList();
}
1) «Наибольший» метод возвращает эту ошибку:
p = getEntityManager().getCriteriaBuilder().and(getEntityManager().getCriteriaBuilder().greatest(r.<Long>get(where.get("name").toString())));
method CriteriaBuilder.and(Expression<Boolean>,Expression<Boolean>) is not applicable
(actual and formal argument lists differ in length)
method CriteriaBuilder.and(Predicate...) is not applicable
(argument type Expression<Long> does not conform to vararg element type Predicate)
и я ищу пример для этого метода, но я не нашел ничего полезного;
2) как я уже писал, мой HashMapp содержит также класс полей, которые я хочу отфильтровать, теперь я бы использовал эту информацию для перезаписи между ними, moreThanOrEqualTo, lessThanOrEqualTo, поэтому, если бы я это сделал, я мог фильтровать некоторые другие типы, кроме java .util.Date!
Что вы думаете об этом длинном вопросе?
Спасибо за вашу помощь!
P.S .: Извините за мой не идеальный английский, но я итальянский.
PS2: Извините, также, за структуру моего кода ... Я слепой и не контролирую все время отступы ... этот сайт контролирует его, но я не уверен, что делаю отступ для всего кода правильно!