2013-07-12 24 views
9

Có cách nào, tôi có thể lấy danh sách các đối tượng riêng biệt User (dựa trên tên người dùng). Và vẫn nhận được kết quả dưới dạng Danh sách các đối tượng User thay vì, Danh sách tên người dùng.Grails - Cách lấy danh sách các đối tượng người dùng riêng biệt

Mã của tôi là

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

Hiện nay đang nhận được Danh sách các tên người dùng, chứ không phải người dùng.

+0

User.findAll không hoạt động? – havenchyk

+0

@baxxabit 1.) Tôi cần có các đối tượng User khác nhau (dựa trên tên người dùng). 2.) Tôi phải sử dụng tiêu chí, vì danh sách thực tế của tôi dựa trên tìm kiếm phức tạp. Vì vậy, findAll() sẽ không khớp. – ashipj

+1

'criteria.listDistinct()'? –

Trả lời

4

Một trong số đó nên làm việc - tôi đã không kiểm tra bất kỳ trong số họ, tôi rời khỏi đó tùy thuộc vào bạn :)

  • User.list().unique()
  • User.list().unique() với equals() phương pháp trên User lớp miền ghi đè để so sánh đối tượng sử dụng username
  • User.list().unique { it.username } (có thể cần toArray() sau list())
.210
+12

Vấn đề với giải pháp này là, đây là bộ lọc trong bộ nhớ. Đầu tiên tất cả các đối tượng người dùng được tìm nạp và sau đó chúng tôi loại bỏ các mục trùng lặp. Không tốt cho một bảng với hàng triệu mục. Và tôi nên sử dụng một "Tiêu chí" Bởi vì tìm kiếm thực tế của tôi phức tạp. – ashipj

+0

Bạn có thể sử dụng danh sách tên người dùng '' (như bạn có trong câu hỏi của bạn) và nhận các đối tượng cho ... 'def userObjects = users. thu thập {User.findByUsername (it)} '? – zoran119

+0

Điều đó sẽ dẫn đến hai cuộc gọi db. Không tốt nếu hiệu suất có mức ưu tiên cao. :) – ashipj

0

Sử dụng nơi truy vấn (tách rời tiêu chí):

def userListQuery = User.where{ 
// Your search criteria 
} 

def userList = userListQuery.list().unique{ it.username } 

nó nên kết quả một truy vấn cho kết quả rõ rệt.

+2

Điều này cũng sẽ tìm nạp tất cả Người dùng từ db và sau đó thực hiện một bộ lọc để tìm kiếm các kết quả độc đáo – ashipj

8

Ya chiếu là như lọc và chọn bằng tên người dùng bạn nên thay đổi nó để

def criteria = User.createCriteria() 
def users = criteria.listDistinct() { 
    projections { 
     groupbyproperty("username") 
    } 
    // setResultTransformer(CriteriaSpecification.ROOT_ENTITY) 
} 
return users 

hoàn thành công việc!

1

Khi nào bạn có bộ sưu tập (danh sách, mảng, ...) (Tôi không biết nếu làm việc với bất kỳ loại bộ sưu tập nào, nhưng hoạt động trong tất cả những gì tôi có thể kiểm tra). Sử dụng unique{ it.property }:

Ví dụ:


def users = [] 
for (def room in rooms) { 
    users.addAll(room.users) 
} 
return users.unique{ it.id } 
0

Điều này sẽ giúp bạn có được đối tượng người dùng khác nhau dựa trên userName

def userInstance = User.list() {độc đáo it.user_name}

.
+0

Câu trả lời này cải thiện như thế nào [câu trả lời cũ hơn nhiều] (https://stackoverflow.com/a/17612 771/487033)? – doelleri

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

Chỉ cần thay thế setResultTransformer (CriteriaSpecification.ROOT_ENTITY) bằng resultTran sformer (ALIAS_TO_ENTITY_MAP). Bạn sẽ nhận được một danh sách chuỗi như là kết quả

nếu không chỉ cần thay thế .list with .listTính năng và sử dụng không cần phân biệt ("tên người dùng"), chỉ có thể là tài sản ("tên người dùng");

Thông thường mọi người gặp vấn đề với phân trang. không phải kết quả. Nếu bạn đã có một cái gì đó như:

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

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

Nó có thể dẫn đến trùng lặp hàng. Bởi vì .listDistinct() không hỗ trợ pagination, chỉ cần thêm

resultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY); 

Vì vậy, truy vấn sẽ trông như thế này:

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

    ilike("others.firstName", "%${query}%"); 
    }); 
Các vấn đề liên quan