【问题标题】:grails findAll() methodgrails findAll() 方法
【发布时间】:2011-08-08 16:19:39
【问题描述】:

我正在使用findAll()类似SQL的方法:

MyDomainClass.findAll("firstname='George' and lastname='kuo' and username='kjlop'"),

但我有问题:

当 value 以数字开头时(例如,当 age='2poj' 时)它会抛出异常

我使用 grails 1.3.2 和 gorm-hbase 0.2.4 插件,在我的域类字段中有 String 类型。

这是堆栈跟踪: 期望范围内的令牌:'0'..'9',找到 'p'

at org.grails.hbase.ghql.LexerRules.nextToken(LexerRules.java:125)

at org.grails.hbase.finders.QueryStringTokenizer.tokenize(QueryStringTokenizer.groovy:59)

at org.grails.hbase.finders.TokenizerStrategy$tokenize.call(Unknown Source)
    //---------

我想知道 groovy 改变 findAll() 方法有什么办法吗?

如果有人知道解决方案,请提供帮助。 提前致谢。

【问题讨论】:

  • 我简直不敢相信 #1 - HQL 语句被正确引用。这正是您正在使用的代码吗? #2也应该工作。如果你在 hsql 上试试呢? 3. 你能试试 MyDomainClass.findAllByFirstnameAndLastname('George', 'kuo') 吗?它应该适用于所有简单类型,包括枚举。
  • @Victor 感谢您的回复...我已经尝试过 MyDomainClass.findAllByFirstnameAndLastname() 方法,它可以在值以数字开头但不适用于枚举值的情况下工作。
  • 除此之外我还必须找到多个属性..

标签: grails find hadoop hsqldb hbase


【解决方案1】:

你可以试试Grails example:

MyDomainClass.findAll("from DomainTable as b where b.firstname=:firstname and b.age=:age", [firstname:'Dan Brown', age: 25]

注意:不知道你是不是打错了,但是'25'是一个字符串,所以不能是age='25'

编辑: 我不知道这怎么行不通,但如果你想找到多个属性,你应该使用createCriteria()。

def c = MyDomainClass.createCriteria()
def results = c.list {
    like("firstName", "George%")
    like("age", "25");
}

EDIT2:抱歉,hbase 插件不支持 createCriteria。根据您的情况,我认为适合尝试 DynamicFinderFilter(适当的导入)。

// all books written by Dan Brown or J K Rowling
   DynamicFinderFilter filterList = new FinderFilterList(Operator.OR)

   DynamicFinderFilter filter1 = new Filter('author', 'Dan Brown')
   filterList.addFilter(filter1)

   DynamicFinderFilter filter2 = new Filter('author', 'J K Rowling')
   filterList.addFilter(filter12)

   results = Book.findAll(filterList)

完整的例子可以在plugin page找到。

【讨论】:

  • @Hoàng Long 在我的域类中,所有字段都具有字符串类型...我已经尝试过 MyDomainClass.findAll("from DomainTable as b where b.firstname=:firstname and b.age=:age" , [firstname:'Dan Brown', age: 25]),但它不起作用...我尝试在 hbase 文档中找到此语法,但没有找到 [link]grails.org/plugin/gorm-hbase ...我认为可以不支持。
  • @Bella:也许我记错了。没关系,我认为您可以使用 createCriteria() 来获得相同的结果:
  • @Hoàng Long 它不起作用...我猜,hbase 也不支持标准。
  • @Bella:对不起,我没有仔细阅读。我认为您还有另一个选择:“FinderFilterList”(grails.org/plugin/gorm-hbase#descriptionTab)。
  • @Hoàng Long:是的,我可以使用过滤器..当第一个字母是数字时,它可以正常工作,但它们不是那么灵活,因为我必须使用“OR”或“AND”过滤器。
【解决方案2】:

您应该能够在域对象上运行dynamic finder method 来实现您所需要的。

示例:

MyDomainClass.findAllByFirstnameAndAge('Dan', 25)

这适用于所有数据类型和枚举。

【讨论】:

  • @Benjiamin 它可以工作,但我必须找到多个属性(例如:MyDomainClass.findAll("username='12a58n' and firstname='George' and lastname='Kuo' and (City ='myCity' 或 City='hisCity')") )
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多