HQL запрос на поиск

0
17 окт 2016 10:29
Есть простой HQL запрос:

 executeHQLQuery("select c from Customer as c where NAME LIKE '" + nameFind + "%' and NAME != '" + pb + "'");


который ищет в столбце NAME таблицы Customer.

Хотел бы организовать поиск с запросом из четырех JTextField по четырем столбцам таблицы, но исключая пустые из них, то есть объединить четыре запроса подобных выше указанному в один.

Подскажите как сделать?

Ответов: 4

0
19 окт 2016 11:44
Сейчас такой вид:

public List<Customer> executeHQLQueryFind(String f1, String f2, String f3, String f4){
        List<Customer> resultListFind = null;
        try {
            Session session = HibernateSessionFactory.getSessionFactory().openSession();
            session.beginTransaction();

            String nativeSQL = "select * from Customer where NAME like :field1Find"
                    +" union "
                    +"select * from Customer where PHONE like :field2Find"
                    +" union "
                    +"select * from Customer where EMAIL like :field3Find"
                    +" union "
                    +"select * from Customer where NOTES like :field4Find";
            
            Query query = session.createSQLQuery(nativeSQL);

            if (f1 != null) {
                query.setParameter("field1Find","%"+f1+"%");
            }
            if (f2 != null) {
                query.setParameter("field2Find","%"+f2+"%");
            }
            if (f3 != null) {
                query.setParameter("field3Find","%"+f3+"%");
            }
            if (f4 != null) {
                query.setParameter("field4Find","%"+f4+"%");
            }
             resultListFind = query.list();

            session.getTransaction().commit();
        } catch (HibernateException he) {
            System.out.println("Ошибка поиска!" + he);
        }
        return resultListFind;
    }
0
18 окт 2016 22:00
Все, я вроде понял что вы хотели, тут надо четыре запроса в один объединять через union.
Но HQL вроде как его не поддерживает, так что придется через нативный sql
    public List executeHQLQueryFind( String f1, String f2, String f3, String f4){
            List resultListFind = null;
            try {
                Session session = HibernateSessionFactory.getSessionFactory().openSession();
                session.beginTransaction();
                String nativeSQL = "select * from Customer where NAME like :field1Find"
                        +" union "
                        +"select * from Customer where PHONE like :field2Find"
                        +" union "
                        +"select * from Customer where EMAIL like :field3Find"
                        +" union "
                        +"select * from Customer where NOTES like :field4Find";

                Query query = session.createSQLQuery(nativeSQL);
                if (f1 != null) {
                    query.setParameter("field1Find","%"+f1+"%");
                }
                if (f2 != null) {
                    query.setParameter("field2Find","%"+f2+"%");
                }
                if (f3 != null) {
                    query.setParameter("field3Find","%"+f3+"%");
                }
                if (f4 != null) {
                    query.setParameter("field4Find","%"+f4+"%");
                }
                resultListFind = query.list();
                session.getTransaction().commit();
            } catch (HibernateException he) {
                System.out.println("Ошибка поиска!" + he);
            }
            return resultListFind;
        }
0
18 окт 2016 19:50
String nameFind = name.getText();
                String phoneFind = phone.getText();
                String emailFind = email.getText();
                String notesFind = notes.getText();


Сейчас метод такой:
public List executeHQLQueryFind( String f1, String f2, String f3, String f4){
        List resultListFind = null;
        try {
            Session session = HibernateSessionFactory.getSessionFactory().openSession();
            session.beginTransaction();
            String hql = "select c from Customer as c where 1 = 1"
                    +"and (:field1Find is null or c.NAME like :field1Find)"
                    +"and (:field2Find is null or c.PHONE like :field2Find)"
                    +"and (:field3Find is null or c.EMAIL like :field3Find)"
                    +"and (:field4Find is null or c.NOTES like :field4Find)";
            Query query = session.createQuery(hql);
            if (f1 != null) {
                query.setParameter("field1Find","%"+f1+"%");
            }
            if (f2 != null) {
                query.setParameter("field2Find","%"+f2+"%");
            }
            if (f3 != null) {
                query.setParameter("field3Find","%"+f3+"%");
            }
            if (f4 != null) {
                query.setParameter("field4Find","%"+f4+"%");
            }
            resultListFind = query.list();
            session.getTransaction().commit();
        } catch (HibernateException he) {
            System.out.println("Ошибка поиска!" + he);
        }
        return resultListFind;
    }


Вызов:
executeHQLQueryFind(nameFind,phoneFind,emailFind,notesFind);
0
17 окт 2016 19:19
Во первых собирать строку запроса с помощью конкатенации это моветон и говнокод, используйте параметры.

Ну, а такой запрос можно сделать например так:
String SQL = "select c from Customer as c where 1 = 1"
    +"and (:field1Find is null or field1 like :field1Find)"
    +"and (:field2Find is null or field2 like :field2Find)"
    +"and (:field3Find is null or field3 like :field3Find)"
    +"and (:field4Find is null or field4 like :field4Find)";

Query query = sessionFactory.getCurrentSession().createQuery(SQL);
if (field1Find != null) {
    query.setParameter("field1Find","%"+field1Find+"%");
}
if (field2Find != null) {
    query.setParameter("field2Find","%"+field2Find+"%");
}
if (field3Find != null) {
    query.setParameter("field3Find","%"+field3Find+"%");
}
if (field4Find != null) {
    query.setParameter("field4Find","%"+field4Find+"%");
}
List<Чего-то там> resultSet = query.list();

Идея надеюсь понятна.

upd: исправлен код
Модераторы: Нет
Сейчас эту тему просматривают: Нет