问题描述
我正在Grails上创建动态查询。 用户界面将传递一个包含所有条件的JSON对象。 我设法做到这一点:
def criteria = params.criteria
def l = DomainClass.createCriteria().list {
for(int k = 0; k < criteria.names().length(); k++) {
def names = list[x].names()
if(DomainClass.hasProperty(names[k])) {
eq(names[k], list[x][names[k]])
}
}
}
如果DomainClass
所有属性都是String
类型,这已经可以工作了,但是我还使用了Long
和Date
类的其他类型,因此我想实现以下内容:
def criteria = params.criteria
def l = DomainClass.createCriteria().list {
for(int k = 0; k < criteria.names().length(); k++) {
def names = list[x].names()
if(DomainClass.hasProperty(names[k])) {
if(/* DomainClass.getProperty(names[k]).getClass() == Long */) {
// Parse first string to long before actually using it to the criteria
eq(names[k], Long.valueOf(list[x][names[k]]).longValue()))
}
else if(/* DomainClass.getProperty(names[k]).getClass() == Date */) {
// parse first date
...
}
else {
// The default criteria
eq(names[k], list[x][names[k]])
}
}
}
}
但是我不知道在Java中还是在Groovy中对if
语句中的条件使用什么。
1楼
有几种方法可以解决这个问题
instanceof
要么
object.getClass().equals(Float.class);
用你的例子,你可以做类似的事情
if(DomainClass.getProperty(names[k]).getClass().equals(Date.class))
2楼
完全符合
new Long(1L).getClass().equals(Long.class)
> true
要么
new Long(1L) instanceof Number
> true
new Long(1L) instanceof Long
> true
您的==
方法(添加了.class
)也应该起作用,因为不太可能加载两个不同的Long类,但我更喜欢equals
方法。
new Long(1L).getClass() == Long.class
> true (most likely)