Intereting Posts
ИСПОЛЬЗОВАНИЕ предложения Keyword vs ON – MYSQL протоколирование логинов пользователей с целью сообщения о том, что клиент превышает количество лицензий Количество дней между двумя датами – ANSI SQL Проблема с рекурсивным CTE в PostgreSQL Отслеживание и диагностика для System.Data.SQLConnection Повторное использование результатов обычного выражения SQL Server JList не отображается на JScrollPane Динамический стержень в оракуле sql INNER JOIN условие в разделе WHERE или ON? Сортировка дерева с материализованным путем? Как я могу сообщить Django о выполнении всех запросов с помощью memmate 10MB? Как я могу сделать запрос MySQL SUM возвращать ноль вместо нуля, если нет записей? SQL – обнаружение циклов в родительских дочерних отношениях Как создать строку для значений, которые не существуют, и заполнить счет с помощью 0 значений? Вставить пустую строку между группами строк и отсортировать по ID в sql

Комплексный поиск по классам grails

Я хочу иметь возможность выполнять сложные поиски на объектах Grails. В настоящее время это реализовано с помощью хранимых процедур на моем сайте, которые создают SQL-запрос и анализируют все эти результаты.

Будет ли что-то вроде плагина, доступного для поиска, позволить мне упростить эту задачу? Мое предположение не так, поскольку в основном он выполняет поиск на основе текста. Хранимые процедуры довольно сложны и трудно меняются. Наши пользователи являются сотрудниками, и запросы связаны с количеством опыта работы и с кем они работают, какими навыками они обладают и т. Д. Объект домена Employee будет иметь такие вещи, как список ролей, которые содержат навыки. Роль будет иметь дату начала и окончания и т. Д.

Список примерных запросов:

All users with 5 years of experience in C++ All users who have worked for Stackoverflow, in California All users who have at least 5 years of C++ experience, at least 2 years of Java experience, have worked for StackOverflow, and are available to work now. 

Я никогда не пробовал плагин, доступный для поиска, поэтому можно продать его коротким. Ваш лучший выбор – это, вероятно, запросы HQL или построитель критериев Hibernate. Мне нравится HQL для сложных запросов, так как он похож на SQL. Для сообщения в блоге, сравнивающего использование этих технологий от Grails, см. http://blog.xebia.com/2008/06/04/querying-associations-in-grails-with-hql-criteria-and-hibernatecriteriabuilder/ Для HQL ссылку см. http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html. Для критериев спящего режима см. http://docs.jboss.org/hibernate/core/3.3/reference/en /html/querycriteria.html

Вы также можете посмотреть плагин FilterPane, чтобы помочь вам (или пользователю) создавать эти запросы. Существует GUI, который может обрабатывать большинство таких вопросов, или вы можете прибегнуть к добавлению полей FilterPane самостоятельно в HTML и контроллер, если вы предпочитаете управлять запросами.

Затем FilterPane переводит поля в построитель критериев Hibernate.

Все запрошенные вами запросы могут быть выполнены с помощью плагина, доступного для поиска .

Я считаю, что вы можете выполнять запросы, предлагаемые с помощью HQL, но Compass / Lucene – действительно лучший инструмент для этого решения

По моему опыту, запросы HQL были единственным решением для сложных запросов.

Некоторые запросы даже потребовали использовать функции non-Hibernate базового БД, например, установить dialect = "org.hibernate.dialect.ExtendedMySqlDialect" в DataSource.groovy, а затем реализовать что-то вроде этого:

 package org.hibernate.dialect; import org.hibernate.Hibernate; import org.hibernate.dialect.function.*; public class ExtendedMySqlDialect extends MySQL5InnoDBDialect { public ExtendedMySqlDialect() { registerFunction("timeStampAdd", new SQLFunctionTemplate(Hibernate.TIMESTAMP, "TIMESTAMPADD(?1, ?2, ?3)")); registerFunction("timeStampDiff", new SQLFunctionTemplate(Hibernate.INTEGER, "TIMESTAMPDIFF(?1, ?2, ?3)")); } 

Вышеупомянутые функции также могут помочь вам при работе с датами.