2012-05-11 37 views
5

Tôi có hai cột Integer trong cơ sở dữ liệu (derby và db2). Tôi cần chia chúng với nhau trong một số JPQL.Làm thế nào tôi có thể sử dụng typcasting bên trong một tuyên bố JPQL?

Cả hai cột thuộc loại Integer trả về số không nếu số còn lại là số thập phân, ví dụ: 0.25 trở thành 0 v.v ... và vì vậy, vì loại là int.

Trong SQL tôi có thể có điều này ví dụ

select CAST(column1 as decimal(6,2))/CAST(column2 as decimal(6,2))from Sometable;

nhưng JPQL tương đương là gì.

Một lựa chọn có thể là (Tôi đã không cố gắng chưa) là phải có một phương pháp @Transient trong thực thể trở về kiểu Decimal và làm tính toán này có và thông qua đó để JPQL nhưng tôi thà để cho SQL làm công việc này.


Mysql không yêu cầu truyền ở cấp cơ sở dữ liệu. Vì vậy, hành vi cho RDBMS khác nhau là khác nhau mà là tốt. Nhưng những gì nên làm với JPQL ra ngoài cần phải sử dụng một truy vấn gốc để biết rằng đúc để thập phân là cần thiết cho hoạt động này.

Thêm phương ngữ <property name="openjpa.jdbc.DBDictionary" value="derby"/> cũng không khắc phục được.

Xin lưu ý đó là JPA1

Trả lời

2

Bạn có cơ bản ba lựa chọn.

  1. Sử dụng tải và để cho java làm điều đó.
  2. Sử dụng Lớp thứ ba và sử dụng toán tử mới trong câu lệnh Select JPLM để gọi hàm khởi tạo và bên trong cuộc gọi bạn có thể quản lý các kiểu dữ liệu sẽ được chuyển đến SQL nhưng bạn sẽ nhận được nhiều hơn loại đối tượng tốt chỉ cần lấy đúng từ bên phải chỉ mục mảng. Khác trên này here.
  3. Sử dụng truy vấn gốc thứ ba như Idanmo cho biết.
2

AFAIK không có một cách để làm điều này loại dàn diễn viên trong JPQL.

Tôi khuyên bạn nên sử dụng thực thi truy vấn gốc của JPA cho phép bạn chạy truy vấn SQL giống như khi bạn đang sử dụng JDBC.

Ví dụ:

Query query = em.createNativeQuery("select CAST(column1 as decimal(6,2))/CAST(column2 as decimal(6,2)) from Sometable"); 

Double result = (Double) query.getSingleResult(); 

hoặc

List<Double> results = (List<Double>) query.getResultList(); 
+0

Tôi có thể mong đợi div/toán tử trả lại số thập phân mà không cần một dàn diễn viên nhưng điều đó không xảy ra. Ngoài ra, việc thiết lập phương ngữ/nên đã thực hiện việc này cũng có thể không đúng. Tôi cũng đang hướng tới nativeQuery nhưng tôi vẫn không tin rằng nó không chỉ là lựa chọn. Nếu đó là loại thật buồn. +1. – Shahzeb

+0

Bạn có thể vui lòng giải thích lý do tại sao bạn mong đợi phương ngữ tự động thực hiện việc truyền? – Victor

+0

@Kaushik vì phân chia hai số nguyên tạo ra một kiểu dữ liệu khác nhau tùy thuộc vào cơ sở dữ liệu bên dưới. Ví dụ, 'Mysql' trả về một số thập phân với số nguyên' Derby' và 'DB2' thay đổi' 0,25' thành '0' chẳng hạn. Có phương ngữ fore phải biết hành vi và cung cấp một machinism đặc biệt là cho rằng tùy chọn của một diễn viên không có sẵn trong 'JPQL '. – Shahzeb

3

Đó là điều hành bộ phận thực hiện phép chia số nguyên trên đối số số nguyên là một tính năng. Trong MySQL, bạn phải chọn rõ ràng div để phân chia số nguyên và / cho phân chia dấu chấm động, trong khi trong JPQL, lựa chọn được thực hiện tự động giống như trong Java.

Vì vậy, tôi đề nghị:

select (column1 * 1.0)/column2 from Sometable; 
Các vấn đề liên quan