我希望能够对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.
答案 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)"));
}
上述功能在处理日期时也可能对您有帮助。