2011-01-19 26 views
10

Tôi đã có bảng này:Với Hibernate, làm thế nào tôi có thể truy vấn một bảng và trả về một hashmap với giá trị khóa id id> name?

table name : Account 
Fields : id (varchar), name(varchar), other fields... 

tôi muốn truy vấn bảng này với cơ chế ngủ đông (để sử dụng các cấp bộ nhớ cache thứ hai). Kết quả của truy vấn ngủ đông phải là bản đồ băm trong đó khóa là id trường và giá trị là tên trường.

Tôi có thể viết bằng HQL bằng cách nào?

Nếu tôi sử dụng bản đồ, tôi chỉ có thể sử dụng bí danh và nếu tôi sử dụng một hàm tạo với đối tượng, tôi phải chuyển kết quả thành hashmap tốn thời gian.

Example : 
Id | name | other fields 
1 Jerome ... 
2 Steve ... 
3 Nick ... 

kết quả của truy vấn phải là một hashmap:

1>Jerome 
2>Steve 
3>Nick 

nhờ

Trả lời

11

Câu hỏi này cũ nhưng điều này vẫn có thể giúp người khác. Bây giờ bạn có thể sử dụng HQL để trả về bản đồ với chế độ ngủ đông. Sử dụng một cái gì đó như thế này:

select new map(max(bodyWeight) as max, min(bodyWeight) as min, count(*) as n) from Cat cat 

Từ tài liệu Hibernate: http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/queryhql.html#queryhql-select

+4

khoảng 1 năm 1/2, tôi cập nhật câu trả lời được chấp nhận của mình! Đây chính xác là những gì tôi đã được tìm kiếm. Đây là một chút quá muộn nhưng một thông tin hữu ích! –

5

Tôi nghĩ gần nhất bạn có thể nhận được là sử dụng truy vấn này:

select id, name from Account 

mà sẽ cung cấp cho bạn một tập kết quả gồm hai mảng chiều dài. Bạn sẽ phải xây dựng bản đồ theo cách thủ công, như vậy:

for(Object[] row : rs) { 
    map.put(row[0], row[1]); 
} 

Lưu ý rằng điều này phần lớn sẽ bỏ qua bộ nhớ cache cấp thứ hai và được dịch sang truy vấn SQL.

0

Giả sử cho thời điểm đó tài khoản không có bất cứ hiệp hội phi lười biếng sẽ được nạp, sau đây chỉ là tốt nhất bạn sẽ nhận được, hiệu suất-khôn ngoan:

List<Account> accounts = (List) session.createQuery("from Account").list(); 
for (Account account : accounts) map.put(account.getID(), account.getName()); 

này có thể được "tốn thời gian" nhưng nó không giống như Hibernate bằng cách nào đó một cách kỳ diệu có thể tránh được bước đặt mỗi hàng trả lại vào một bản đồ.

Không giống như câu trả lời khác, điều này sẽ được hưởng lợi từ bộ nhớ cache cấp thứ hai.

2

Chế độ thực thể mặc định của Hibernate là EntityMode.POJO.

bạn có thể sử dụng chế độ thực thể EntityMode.MAP để truy xuất đầu ra truy vấn ở định dạng Bản đồ.

+0

http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/persistent-classes. html # persistent-classes-dynamicmodels –

0

Hiii ...

Mã dưới đây có thể giúp bạn.

Query query = session.createQuery("select id, name from table"); 
    List results = query.list(); 

Để hiển thị kết quả như các đối tượng làm việc:

int i; 
    int j; 
    Object object = null; 
    for (i = 0; i < results.size(); i++) { 

     System.out.println("-------"); 
     Object[] obj = (Object[]) results.get(i); 
     for (j=0;j<obj.length;j++) 
     { 
      System.out.println(obj[j]); 
     } 
     System.out.println("-------"); 

    } 

Chỉnh sửa: Bạn có thể sử dụng mà kết quả đối tượng như bản đồ và you'r thực hiện.

-1

sử dụng tên thực thể mặc định, bạn có thể áp dụng tên thực thể cho tệp hbm.xml.

cho Ví dụ

sử dụng này, hibernate cung cấp cho các cặp khóa/giá trị đó có nghĩa là quay trở lại bản đồ.

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