2013-01-10 35 views
10

tôi đang cố gắng để truy vấn postgres sử dụng tiêu chí hibernate/Hạn chế like với từ khóa phần:Hibernate Hạn chế Giống như

Criterion c1 = Restrictions.like("stateName", "Virg*"); 
cri.add(c1); 

return cri.list(); 

Nó không trả lại bất cứ điều gì nhưng Restrictions.like("stateName", "Virginia"); lợi nhuận kỷ lục đúng. Làm cách nào để sử dụng các hạn chế một phần như trong chế độ ngủ đông?

EDIT: Got nó làm việc bằng cách làm một cái gì đó như thế này:

public static List<Object> createQueryStringByRegex(Criteria cri, 
     Parameters p) { 
    String value = (String) p.value; 
    if (value.contains("*")) { 
     value = value.replace("*", "%"); 
    } else { 
     value += "%"; 
    } 
    // System.out.println("Value: "+value); 
    Criterion c1 = Restrictions.ilike(p.property, value); 
    cri.add(c1); 

    return cri.list(); 

} 

Trả lời

44

Sử dụng enum MatchMode để giúp bạn với nó:

Criterion c1 = Restrictions.like("stateName", "Virg", MatchMode.END); 

Không sử dụng bất kỳ ký tự đặc biệt, như *. Và nếu bạn muốn có phân biệt chữ hoa chữ thường, hãy sử dụng ilike.

+0

không sử dụng 'ilike' phụ thuộc vào nếu DB bên dưới có hỗ trợ không? I E. Postgres hỗ trợ ilike nhưng những người khác có thể không? – mmcrae

+1

Tôi tin rằng không, ít nhất là không có bất cứ điều gì về nó trong tài liệu. Có lẽ Hibernate tự cung cấp tính năng này. –

+0

Vì lợi ích của câu hỏi của mình, nên 'MatchMode' là' MatchMode.START'? – DanielK

9

Hạn chế nên sử dụng các biểu tượng phần trăm.

Criterion c1 = Restrictions.like("stateName", "Virg%"); 
+2

Cách bạn linh hoạt hơn trong đó cơ sở dữ liệu để chọn hoặc di chuyển sang trong tương lai nếu bạn sử dụng 'MatchMode' như được đề xuất bởi câu trả lời của Juliano. – DanielK

+0

Chỉ cần sử dụng MatchMode, điều này là đánh bại một trong những lý do để sử dụng API ở nơi đầu tiên, đó là cho mã của bạn được cơ sở dữ liệu bất khả tri! – Willa

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