2010-08-16 34 views
6

Xin chào các bạn, tôi đang gặp một số vấn đề với các kết quả khớp chính xác trong khi thực hiện một lệnh NamedQuery.JAVA: Vấn đề về chuỗi tên miền được đặt tên

Tôi hiện đang sử dụng một cái gì đó như thế này:

@NamedQuery(name = MyClass.GET_ENTRY_BY_NAME, query = "select e from Entry e where e.name =:"+ Entry.NAME) 

... 

Query query = em.createNamedQuery(MyClass.GET_ENTRY_BY_NAME); 
     query.setParameter(Entry.NAME, myEntry.getName()); 

Nó hoạt động cho hầu hết các trường hợp, tuy nhiên tôi nhận thấy rằng trong trường hợp người sử dụng vượt qua tên tập tin với một khoảng trống ở cuối, các namedQuery bỏ qua nhân vật đó. Ví dụ:

Query query = em.createNamedQuery(MyClass.GET_ENTRY_BY_NAME); 
     query.setParameter(Entry.NAME, myEntry.getName()+ " "); 

Sẽ trả lại kết quả tương tự như truy vấn trước đó. Bỏ qua xác thực 'mục nhập hợp lệ' của tôi. Nói cách khác, tôi muốn truy vấn trả về không có mục nào và xử lý lỗi sau này.

Một workaround tôi có thể nghĩ ra, là đặt dấu nháy đơn xung quanh tham số của tôi trong namedQuery, như thế này:

@NamedQuery(name = MyClass.GET_ENTRY_BY_NAME, query = "select e from entry e where e.name =':"+ Entry.NAME "'") 

Tuy nhiên nó sẽ thùng rác mã của tôi trong trường hợp String chứa dấu nháy đơn trong nó .. .

Bất kỳ ý tưởng nào?

Trả lời

4

tôi đã làm một số nghiên cứu trong JPA và phát hiện ra rằng nó hiện một số tự động cắt tỉa cho kiểu chars, tôi Tôi không chắc liệu điều này có giống với Strings hay không, nhưng vì nó đang xảy ra với tôi ... Tôi tin như vậy. Cách duy nhất để bỏ qua nó là bằng cách thiết lập một số thuộc tính trong đối tượng DatabaseLogin session (xem http://www.eclipse.org/eclipselink/api/1.1/org/eclipse/persistence/sessions/DatabaseLogin.html#setShouldTrimStrings).

Tôi không muốn làm rối tung lên các thuộc tính phiên vì vậy tôi quyết định thực hiện một số loại kiểm tra và ném cùng một ngoại lệ như lỗi NoResultException thực hiện trong mã của tôi.

tôi về cơ bản đã lấy kết quả từ cơ sở dữ liệu và so sánh lĩnh vực này với String tôi đã sử dụng:

query.setParameter(Entry.NAME, myEntry.getName()); 

... 

if(!StringUtils.equals(result.getName(), myEntry.getName()){ 
    do a cool throw just like NoResultException Catch 
} 

Tôi cũng đã phải bao gồm các chức năng axtavt Trim! Đây chỉ là để đảm bảo rằng nếu cơ sở dữ liệu có một cột có dấu cách và nó khớp với tham số được đưa ra bởi người dùng, nó sẽ được bao gồm như một câu trả lời hợp lệ. Ví dụ:

Mục cơ sở dữ liệu: Tên = "Flavio" - Được cắt bằng hàm = "Flavio".

Thông số được chuyển: Tên = "Flavio" - Được cắt bằng chức năng tự động JPA = "Flavio".

Nếu nó không được cắt ở tất cả, nó sẽ chỉ So sánh "Flavio" với "Flavio", trả về NoResult khi nó được cho là trả lại mục nhập đó.

Giải pháp khó xử, nhưng miễn là không có cách nào khác để dừng tự động cắt, chúng tôi sẽ phải sử dụng loại thứ này.

Cảm ơn tất cả các câu trả lời khác !!

4

Tôi đoán điều này xảy ra vì trường cơ sở dữ liệu của bạn được khai báo là CHAR(...) và do đó giá trị được lưu trữ được đệm với khoảng trắng không được tính đến bởi hoạt động =.

Vì vậy, bạn có thể hoặc tuyên bố lĩnh vực cơ sở dữ liệu của bạn như VARCHAR(...) hoặc sử dụng một built-in trim chức năng:

query = "select e from Entry e where trim(trailing from e.name) =:"+ Entry.NAME 
+0

Hi axtavt, cảm ơn vì sự nhanh chóng trong câu trả lời! Vâng, cơ sở dữ liệu của tôi được đặt thành VARCHAR. Nhưng tôi không chắc chắn nếu phiên bản MySql có bất cứ điều gì để làm với vấn đề này. Tôi cũng nghĩ đến việc cắt bớt trước khi đặt tham số cho truy vấn, tuy nhiên tôi muốn phần mềm trả về lỗi cho bất kỳ thứ gì khác với cơ sở dữ liệu, đảm bảo rằng người dùng nhập chính xác những gì anh ta muốn. –

+0

@flavio: Tôi không quen với MySQL, vì vậy không thể nói gì về các tính năng của nó. Cũng lưu ý rằng mẫu truy vấn của tôi trims giá trị được lưu trữ, không phải là tham số, do đó kết quả phải chính xác. – axtavt

+0

Tôi đã sửa lỗi mã kiểm tra quá trình xây dựng Truy vấn ... Với mã bạn đã cung cấp, có vẻ như vấn đề nằm trong mySql. Tôi nhận thấy rằng cả hai tham số và mục cơ sở dữ liệu là khác nhau ... tuy nhiên đối với một số lực lượng thần bí không rõ MySql chỉ trims không gian và xem xét nó chính xác phù hợp ... Bây giờ tôi nghĩ rằng tôi có một số nghiên cứu để làm để xem nếu điều này là thực sự là một hành vi MySql mong đợi hoặc có cái gì đó khác đằng sau nó. Còn bây giờ tôi nghĩ tôi sẽ phải thực hiện một số kiểm tra bổ sung. Cảm ơn! –

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