2011-04-19 53 views
0

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

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

,但我有问题:

当值以数字开始时(例如,当年龄= '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) 
    //--------- 

不知是否有常规变化的findAll()方法的工作的任何方式?

如果有人知道解决方案,请帮忙。 在此先感谢。

+0

我简直不敢相信#1 - 正确引用了HQL语句。它正是你使用的代码吗? #2也应该工作。如果你在hsql上试用它会怎么样? 3.你可以试试MyDomainClass.findAllByFirstnameAndLastname('George','kuo')吗?它应该适用于每种简单类型,包括枚举。 – 2011-04-19 16:23:47

+0

@Victor感谢您的回复...我试过MyDomainClass.findAllByFirstnameAndLastname()方法,它在大小写值开头的情况下起作用,但它不适用于枚举值。 – Bella 2011-04-20 07:10:15

+0

除此之外,我必须找到多个属性.. – Bella 2011-04-20 07:25:05

回答

0

你可以尝试像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:对不起,个createCriteria不HBase的插件支持。根据您的情况,我认为适合尝试使用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找到。

+0

@Hoàng龙在我的领域类中的所有字段都有字符串类型...我试过MyDomainClass.findAll(“从DomainTable作为b,其中b.firstname =:firstname和b。年龄=:年龄“,[名字:'丹布朗',年龄:25]),但它不工作...我试过在hbase文档中找到这个语法,但没有找到[link] http:// www .grails.org/plugin/gorm-hbase ...我认为它不支持它。 – Bella 2011-04-20 07:22:47

+0

@贝拉:也许我记得它错了。没关系,我想你可以使用createCriteria()获得相同的结果: – 2011-04-20 08:09:26

+0

@HoàngLong它不起作用......我想,hbase也不支持标准。 – Bella 2011-04-20 09:29:46

0

您应该可以在域对象上运行dynamic finder method以实现您所需的功能。

例子:

MyDomainClass.findAllByFirstnameAndAge('Dan', 25) 

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

+0

@Benjiamin它的作品,但我必须找到与多个属性(例如:MyDomainClass.findAll(“用户名='12a58n'和firstname ='乔治'和姓氏''郭'和(城市='myCity'或城市= 'hisCity')“)) – Bella 2011-04-20 07:18:44