2013-01-12 28 views
5

Tôi muốn sử dụng (tìm kiếm) nội địa hóa trong các mô hình của tôi, và tôi đã đưa ra các mô hình sau:HQL chọn trên bản đồ được nhúng

@Entity 
public class Category { 
    ... 
    @ElementCollection 
    //key = language code (e.g. 'en') and value = localized label 
    private Map<String, String> name; 
    ... 
} 

Những gì tôi muốn làm không là để truy vấn cho các hạng mục có chứa một kim caseinsensitive trong một địa phương hóa đặc biệt (ví dụ với '% abc%' trong tên tiếng Anh của họ)

tôi đã cố gắng một cái gì đó giống như

from Category where name.key = :locale and lower(name.value) like :text 

nhưng điều đó không thành công với một không thể d Yếu tố thu thập vô hướng ereference ngoại lệ.

Bây giờ Docu ngủ đông nói, tôi phải sử dụng các phần tử() và chỉ mục() cho các giá trị và khóa. Đối với khóa này sẽ dễ dàng sử dụng :locale in indices(name), nhưng làm thế nào tôi có thể kết hợp một phần của giá trị của miền địa phương này một cách không hợp lý?

Và chỉ trong trường hợp điều này không thể thực hiện được với hql với mô hình của tôi, tôi có thể tạo mô hình hóa nội địa có thể tìm kiếm được bằng cách nào khác?

+0

có lý do tại sao tôi đã được downvoted? – Flo

Trả lời

3

Cuối cùng tôi đã đưa ra các giải pháp sau đây (thực sự tôi khá chắc chắn nó cũng sẽ làm việc sử dụng kế hoạch bản đồ thay vì đối tượng nhúng)

@Entity 
public class Category { 
    ... 
    @ElementCollection 
    @CollectionTable(name = "locale_category_name", [email protected](name="id")) 
List<Localization> name; 
    ... 
} 

@Embeddable 
public class Localization { 
    @NotNull 
    public String locale; 
    @NotNull 
    public String label; 
} 

và truy vấn (sử dụng tham gia ... với .. .)

from Category c join c.name l with (l.locale = :locale and lower(l.label) like :text) 

Edit: Thật sự tôi đã không thể có được nó để làm việc với một bản đồ, vì vậy tôi đang sử dụng giải pháp @Embeddable sau khi tất cả

+0

thực sự, tôi đã thử nó bây giờ, và nó không có vẻ làm việc với Bản đồ - tôi luôn luôn nhận được một lỗi không thể trì hoãn skalar. Tôi sử dụng 'khóa' và 'giá trị' làm tên cột, nhưng có thể không biết nếu đó là chính xác. – Flo

+0

Tôi đã làm một số ví dụ khác và phát hiện ra, nếu tôi sử dụng 'Map ' thì truy vấn của tôi phải là: 'từ Category c, nơi thấp hơn (c.name [: locale]) như: text' – Flo

Các vấn đề liên quan