2010-11-16 69 views
0

我希望能够对grails对象执行复杂的搜索。这是目前使用我的网站上的存储过程实现的,它们构建了一个SQL查询并解析了所有这些结果。跨Grails域类的复杂搜索

类似可搜索插件的东西是否允许我简化这项任务?我的猜测不是,因为它主要是在做基于文本的搜索。存储过程非常复杂,难以改变。我们的用户是员工,这些查询必须与大量的工作经验,他们的工作对象,他们拥有的技能等有关。员工域对象应该包含一些包含技能的角色列表。该角色将有开始和结束日期等

例如查询列表:

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. 

回答

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

0

您列出了可以与searchable plugin来完成查询的全部。

我相信你能做到的疑问你已经提示HQL但北斗/ Lucene是真正该解决方案的更好的工具

1

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

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

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

上述功能还可以与日期打交道时帮助你。