2013-05-22 33 views
9

Cách thích hợp để tìm một tên người dùng phù hợp với Người dùng là gì?So sánh chuỗi phân biệt chữ hoa chữ thường trong Slick?

Với người dùng định nghĩa loại tài khoản:

case class User (userId: String, username: String) 

object User extends Table[User]("user") { 
    def userId = column[String]("userId", O.PrimaryKey) 
    def username = column[String]("username") 
    def * = userId ~ authId ~ username <>(User.apply _, User.unapply _) 

    Database.forDataSource(DB.getDataSource()) withSession { 
    implicit session: Session => 

    val q = for { u <- User if u.username.equalsIgnoreCase(someUsername) } 
     yield u 
    q.headOption 

user.username là loại Cột [Chuỗi] mà không có chuyển đổi sang String.

Điều mong muốn là để Cơ sở dữ liệu thực hiện so sánh chuỗi không phân biệt như một phần của truy vấn.

Trả lời

16

tôi đã có một tình huống tương tự và giải quyết nó bằng cách sử dụng phương pháp toLowerCase mở rộng:

p <- u.party if p.loginName.toLowerCase === partyName.toLowerCase

Bạn có thể tìm here phương pháp khuyến nông hơn, đặc biệt là String ones.

+0

Thật thú vị, tôi đã cố gắng làm một cái gì đó tương tự và cân bằng chuỗi bằng cách sử dụng phương pháp '.capitalize' dưới Slick, tuy nhiên điều đó không hiệu quả vì nó chỉ viết hoa chuỗi' partyName' của tôi chứ không phải là 'p.loginName'. '. toLowerCase' dường như làm thủ thuật! – dbau

+2

Bạn nên lưu ý rằng đối với các bảng lớn, điều này trở nên rất kém hiệu quả và trong một số trường hợp, nó có thể ngăn cản việc sử dụng các chỉ mục hợp lý. Tôi nhớ một trường hợp cụ thể, nơi đây là truy vấn chạy thường xuyên nhất, toàn bộ điều đã có tác động đáng kể đến toàn bộ hệ thống. Một số hệ thống DB có thể cho phép tạo các chỉ mục trên các ứng dụng hàm (ví dụ: LOWERCASE ('loginName')) nhưng trong trường hợp cụ thể này, tôi phải tạo một cột thứ cấp trong db' loginName_lowercase' chứa một bản sao thường của 'loginName' và được sử dụng trong truy vấn. Điều này có tác động rất tích cực đến hiệu suất. –

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