跨Grails域类的复杂搜索
我希望能够对grails对象执行复杂的搜索。这是目前使用我的网站上的存储过程实现的,它们构建了一个SQL查询并解析了所有这些结果。跨Grails域类的复杂搜索
类似可搜索插件的东西是否允许我简化这项任务?我的猜测不是,因为它主要是在做基于文本的搜索。存储过程非常复杂,难以改变。我们的用户是员工,这些查询必须与大量的工作经验,他们的工作对象,他们拥有的技能等有关。员工域对象应该包含一些包含技能的角色列表。该角色将有开始和结束日期等
例如查询列表:
All users with 5 years of experience in C++
All users who have worked for *, in California
All users who have at least 5 years of C++ experience, at least 2 years of Java experience, have worked for *, 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 对Hibernate的标准看 http://docs.jboss.org/hibernate/core/3.3/reference/en/html/querycriteria.html
你也可以看看在FilterPane插件来帮助您(或用户)构建这些查询。有一个GUI可以处理大多数此类问题,或者如果您希望控制查询,则可以自行在HTML和控制器中添加FilterPane字段。
FilterPane然后在内部将字段转换为Hibernate条件生成器。
根据我的经验,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)"));
}
上述功能还可以与日期打交道时帮助你。