Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Grails-如何获取不同用户对象的列表_Grails - Fatal编程技术网

Grails-如何获取不同用户对象的列表

Grails-如何获取不同用户对象的列表,grails,Grails,有没有一种方法可以让我获得不同的User对象列表(基于用户名)。并且仍然将结果作为用户对象的列表,而不是用户名的列表 我的代码是 def criteria = User.createCriteria() def users = criteria.list() { projections { distinct("username") } setResultTransformer(CriteriaSpecification.ROOT_ENTITY) } ret

有没有一种方法可以让我获得不同的
User
对象列表(基于用户名)。并且仍然将结果作为
用户
对象的列表,而不是用户名的列表

我的代码是

def criteria = User.createCriteria()
def users = criteria.list() {
    projections {
        distinct("username")
    }
    setResultTransformer(CriteriaSpecification.ROOT_ENTITY)
}
return users

目前,我得到的是用户名列表,而不是用户。

其中一个应该可以工作-我还并没有测试过任何一个,我留给你们:)

  • User.list().unique()
  • User.list()
  • User.list().unique{it.username}
    (可能需要
    toArray()
    list()之后)
使用where查询(分离条件):


它应该会产生一个查询以获得不同的结果。

Ya投影就像过滤和按用户名选择一样,您应该将其更改为

def criteria = User.createCriteria()
def users = criteria.listDistinct() {
    projections {
        groupProperty("username")
    }
}
return users

工作完成了

你从哪里得到一个集合(列表、数组等等)(我不知道是否可以使用任何类型的集合,但我可以测试所有类型的集合)。使用
unique{it.property}

例如:



这将根据用户名获得不同的用户对象

def userInstance=User.list().unique{it.User_name}

def criteria = User.createCriteria()
def users = criteria.list() {
    projections {
        distinct("username")
    }
    setResultTransformer(CriteriaSpecification.ROOT_ENTITY)
}
只需将setResultTransformer(CriteriaSpecification.ROOT\u ENTITY)替换为resultTransformer(别名\u到\u ENTITY\u映射)。您将得到一个字符串列表作为结果

否则,只需将.list替换为.listDistinct,而use不需要distinct(“用户名”),只需是属性(“用户名”)

通常人们会遇到分页问题。不是结果。如果您已经有了类似于:

User.createCriteria().list([max:params.max,offset:params.offset],{
createAlias("others", "others", CriteriaSpecification.LEFT_JOIN);

ilike("others.firstName", "%${query}%");
});
这可能会导致行重复。因为.listDistinct()不支持分页,所以只需添加

resultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
因此,查询将如下所示:

User.createCriteria().list([max:params.max,offset:params.offset],{
    resultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
    createAlias("others", "others", CriteriaSpecification.LEFT_JOIN);

    ilike("others.firstName", "%${query}%");
    });

User.findAll不工作?@baxxabit 1。)我需要获取不同的用户对象(基于用户名)。2.)我必须使用标准,因为我的实际列表基于复杂的搜索。因此findAll()不适合。
criteria.listDistinct()
?根据Grails文档“listDistinct()方法不能很好地与分页选项maxResult和firstResult配合使用”。这里的用户也应该基于用户名而不是基于equals方法或id进行区分。从数据库的角度来看,这个问题没有意义。一旦你做了一个不同的调用,你就会任意地获取与用户名匹配的第一个结果并将其保留回来。您可能需要使用HQL来实现这一点,但我仍然不确定您为什么要这样做。在我看来,如果可以复制用户名,那么用户表中就有一个设计缺陷。这个解决方案的问题是,这是内存过滤。首先获取所有用户对象,然后删除重复条目。对于一个有数百万条目的表来说并不好。我应该使用一个“条件”。因为我的实际搜索很复杂。你能使用
用户
用户名列表(正如你在问题中所做的那样)并获取这些的对象吗…
def userObjects=users.collect{User.findByUsername(it)}
?这将导致两个db调用。如果性能是高优先级的,则不太好。:)用户名是否经常重复?如果不同列表仅略小于表项数,则内存中的筛选应该不错…用户名经常重复,通常超过70%的搜索结果是重复的。这将还可以从数据库中获取所有用户,然后进行筛选以找到唯一的结果。这是一个如何改进的答案?这也是ashipjIt提到的内存中筛选的一个示例,应该是
groupProperty
camel case:)
resultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
User.createCriteria().list([max:params.max,offset:params.offset],{
    resultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
    createAlias("others", "others", CriteriaSpecification.LEFT_JOIN);

    ilike("others.firstName", "%${query}%");
    });