跨Grails域类的复杂搜索

时间:2010-11-16 23:18:50

标签: sql search grails grails-plugin

我希望能够对grails对象进行复杂的搜索。目前,这是使用我的站点上的存储过程实现的,这些存储过程构建SQL查询并解析所有这些结果。

像可搜索插件这样的东西能让我简化这项任务吗?我的猜测不是,因为它主要是基于文本的搜索。存储过程非常复杂,很难改变。我们的用户是员工,查询涉及大量的工作经验和工作对象,他们有什么技能等。员工域对象将包含包含技能的角色列表。该角色将有一个开始和结束日期等。

示例查询列表:

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.

4 个答案:

答案 0 :(得分:2)

我从来没有尝试过可搜索的插件,所以可能卖得很短。您最好的选择可能是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 对于Hibernate标准,请参阅 http://docs.jboss.org/hibernate/core/3.3/reference/en/html/querycriteria.html

答案 1 :(得分:1)

您还可以查看FilterPane插件,以帮助您(或用户)构建这些查询。有一个GUI可以处理大多数此类问题,或者如果您希望控制查询,则可以在HTML和控制器中自行添加FilterPane字段。

FilterPane然后在内部将字段转换为Hibernate条件构建器。

答案 2 :(得分:0)

您列出的所有查询都可以使用searchable plugin完成。

我相信您可以使用HQL进行查询,但Compass / Lucene确实是该解决方案的更好工具

答案 3 :(得分:0)

根据我的经验,HQL查询是复杂查询的唯一解决方案。

有些查询甚至要求使用底层数据库的非Hibernate函数,例如:在DataSource.groovy中设置dialect = "org.hibernate.dialect.ExtendedMySqlDialect",然后实现类似这样的内容:

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)"));
}

上述功能在处理日期时也可能对您有帮助。