2010-09-09 47 views
14

Tôi có thể viết truy vấn JPA bằng cách sử dụng chức năng MONTH giống như truy vấn sql như thế nào?Chức năng truy vấn JPA MONTH/YEAR

@NamedQuery(name="querybymonth", query="select t from table1 t where MONTH(c_Date) = 5") 

Khi tôi sử dụng mẫu trên cho truy vấn, tôi gặp lỗi: unexpected token - MONTH.

Trả lời

19

Nếu bạn đang sử dụng EclipseLink (2.1), bạn có thể sử dụng hàm FUNC() để gọi bất kỳ hàm cơ sở dữ liệu nào không được xác định trong thông số JPA JPQL.

ví dụ: FUNC ('THÁNG', c_Date)

Trong JPA 2.1 (EclipseLink 2.5) cú pháp FUNCTION trở thành một phần của đặc tả (và thay thế FUNC EclipseLink cụ thể).

Nếu bạn đang sử dụng TopLink Essentials, bạn không thể thực hiện điều này trong JPQL, nhưng bạn có thể xác định truy vấn TopLink Expression cho nó (tương tự như tiêu chuẩn JPA 2.0) hoặc sử dụng SQL gốc.

Ngoài ra nếu bạn đang sử dụng bất kỳ nhà cung cấp JPA 2.0 nào và sử dụng truy vấn Tiêu chí, có một hàm() API có thể được sử dụng để xác định điều này.

+0

Xin chào James, Cảm ơn câu trả lời của bạn. Tôi thực sự đang sử dụng các yếu tố cần thiết. Tôi đã áp dụng cách như trên bu tôi vẫn nhận được: Mã thông báo không mong đợi - FUNC. Vui lòng trợ giúp! – venomrld

+0

@venomrld Như James đã viết, công cụ FUNC này có sẵn EclipseLink 2.1+, xem [Bug 300512] (https://bugs.eclipse.org/bugs/show_bug.cgi?id=300512). Vì vậy, tôi không mong đợi để tìm thấy nó trong TopLink Essentials. –

+0

Vì vậy, tôi bị kẹt. Xin vui lòng giúp đỡ nếu một số cách tồn tại. Tôi đang sử dụng netbeans 6.5 và các khuôn mặt trực quan để phát triển. Dường như tôi đã thay đổi khá nhiều mã để di chuyển. – venomrld

3

Hàm MONTH() tồn tại trong HQL Hibernate nhưng không phải là hàm JPA chuẩn. Có lẽ nhà cung cấp JPA của bạn có một số tương đương độc quyền nhưng bạn không đề cập đến nó. Nếu không, hãy quay trở lại với SQL nguyên gốc.


I am using Toplink Essentials for the same. Please help, if any function exists in Toplink. Thanks.

Theo hiểu biết của tôi, TopLink không có tương đương trực tiếp. Vì vậy, hoặc là sử dụng một truy vấn SQL bản địa hoặc có thể là một truy vấn TopLink Expression (không chắc chắn về điều này, và không chắc chắn điều này có sẵn trong TopLink Essentials).

+0

Xin chào! Tôi đang sử dụng Toplink Essentials cho cùng. Xin vui lòng giúp đỡ, nếu có chức năng tồn tại trong Toplink. Cảm ơn. – venomrld

6

Tôi muốn truy vấn YEAR (itemDate) nhưng chức năng không thoát, sau đó tôi thấy hàm SUBSTRING() vì vậy những gì tôi đã làm là Select q from table where SUBSTRING(itemDate, 1, 4)='2011' và nó hoạt động cho tôi! hy vọng nó giúp!

nếu bạn cần biến động, bạn cũng có thể làm điều đó. ở đây: poDate là năm bị mất trong setParameter();

@NamedQuery(name = "PurchaseOrders.findByYear", query = "SELECT p FROM PurchaseOrders p WHERE SUBSTRING(p.poDate, 1, 4) = :poDate") 

Query q = em.createNamedQuery("PurchaseOrders.findByYear"); 
q.setParameter("poDate", s_year+""); 

nhưng nếu bạn đồng ý với giải pháp của mình, điều đó sẽ ổn thôi. tôi chỉ tìm JPA nhanh hơn để thực thi.

+0

Cảm ơn bạn đã trả lời .. Thực ra vấn đề tôi đang đối mặt là giá trị động .. tức là Giá trị được lấy từ biến chỉ ... Vì vậy, tôi đã chuyển sang truy vấn SQL gốc và chúng hoạt động tốt. Dù sao, cảm ơn một lần nữa. – venomrld

1

Làm việc sau cho tôi với hibernate (4.3.9.Final) & JPA 2.1.

@NamedQuery (name = "PartyEntity.findByAID", query = "chọn psc.party biệt từ PartyShortCode psc nơi (psc.shortCode =: aidNumber hoặc CHỨC NĂNG ('REPLACE', psc.accountReference,' '' ') =: aidNumber) và psc.sourceSystem trong: sourceSystem ")

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