2014-12-12 20 views
5

Tôi đang cố gắng sử dụng Joda lớp tiền với các loại Jadira để xử lý bản đồ để Hibernate 4.Sum của Joda tiền chia thành 2 cột với mùa xuân dữ liệu JPA

Đó là làm việc ổn (ngoại trừ việc tôi nhận được quá nhiều trường tiền tệ).

Nhưng tôi cần phải tạo truy vấn tổng hợp để tổng hợp một số tổng.

Đây là khai báo loại.

@Columns(columns = { @Column(name = "total_currency", length=10), @Column(name = "total") }) 
@Type(type = "org.jadira.usertype.moneyandcurrency.joda.PersistentMoneyAmountAndCurrency") 
private Money total; 

Và tôi đang cố gắng để xác định một truy vấn, một cái gì đó như:

@Query(value="select sum(oi.total) from OrderItem oi where oi.order = ?1") 
Double calculateSubtotal(Order order); 

Có cách nào để tổng hợp truy vấn đối với một lĩnh vực tiền sử dụng JPQL?

Cảm ơn.

+0

Vì vậy, kết quả của nỗ lực của bạn là bí mật được phân loại hàng đầu? :) –

+0

Đây là một thời gian trước đây, thành thật mà nói tôi đã không có ý tưởng làm thế nào tôi giải quyết nó cuối cùng. Tôi không thể nhớ lại. Có lẽ tôi đã kết thúc việc lặp lại nó bằng mã bởi vì tôi không nghĩ có giải pháp nào sắp tới - hoặc có lẽ tôi thậm chí có thể loại bỏ toàn bộ loại tiền Joda và chuyển sang số thập phân và một số phần mềm trung gian trước/sau để quản lý một trường tiền tệ riêng biệt . –

+0

@Richard Bạn có thể đăng truy vấn chính xác với các thuộc tính từ Tiền mà bạn muốn hiển thị không?Cảm ơn –

Trả lời

3

Có hai cách, nhưng chúng có giới hạn và tôi nghi ngờ bạn sẽ thực sự thích chúng: ( Hạn chế chính là trong Hibernate HQL bạn không thể gọi phương thức trừ khi chúng được ánh xạ các thuộc tính - kết thúc câu chuyện. không hỗ trợ Phương thức Gọi

Mặt khác, bạn có thể Ánh xạ một cột nhiều lần tùy ý bạn chỉ cần nhớ một bản đồ duy nhất có thể cập nhật được. Có điều này cần lưu ý Bước đầu tiên là bạn cần Làm theo ý thức của Hibernate về số tiền joda Money. Rõ ràng là bạn không thể chỉ chú thích nó. Có hai cách để bạn làm điều này:

  1. Bạn có thể sử dụng XML để thực sự chú thích lớp Money là lớp @Embeddable. Cấu hình hibernate XML có thể được sử dụng để cấu hình cái gì đó là nguồn đóng. Từ những gì tôi thấy trong cấu hình thời gian joda tiền.

  2. Giải pháp thứ hai. Có lẽ là cái tôi sẽ sử dụng. Là để bọc lớp Money trong một Wrapper được khai báo là @Embeddable. Trình bao bọc nhúng này, bạn có thể định nghĩa nhiều ánh xạ cho các cột cơ sở dữ liệu hiện có của bạn. Khi bạn đặt giá trị cho WRAPER, giá trị này sẽ được đẩy vào thời gian soda Tiền bên trong.

Khi bạn thực hiện việc này, bạn có thể hiển thị thông qua bất kỳ thuộc tính nào của lớp Money mà bạn muốn và thực hiện bất kỳ tập hợp nào bạn muốn.

@Embeddable 
public class MoneyWrapper { 


    @Columns(columns = { @Column(name = "total_currency", length=10), @Column(name = "total") }) 
    @Type(type = "org.jadira.usertype.moneyandcurrency.joda.PersistentMoneyAmountAndCurrency") 
    Money totalmoney; 


    @Column(name = "total",updateable=false,insterable=false); 
    BigDecimal total to agregate; 

    @Column(name = "total_currency",updateable=false,insterable=false); 
    BigDecimal totalCurrency; 
} 

Như một kết quả của bản đồ này, bạn có thể thực hiện một truy vấn như:

@Query (value = "select chọn sum (oi.total.totalCurrency) từ OrderItem oi nơi oi.order =? 1 ")

+0

Tôi không làm việc trong dự án này nữa, nếu Andreas, anh chàng đã đăng tiền thưởng nói điều này là ổn, tôi rất vui khi chấp nhận câu trả lời. –

+0

cảm ơn cho đầu vào đó, tôi muốn trao thưởng tiền thưởng nếu có thể –

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