Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Truy vấn gốc ở chế độ ngủ đông - cột char (3)

Có vẻ như Hibernate đọc giá trị của loại CHAR(n) dưới dạng Character . Cố gắng truyền nó thành VARCHAR(n) :

Query q2 = em.createNativeQuery(
    "select cast(sc_cur_code as VARCHAR2(3)), sc_amount from sector_costs");  

Khi sử dụng Hibernate qua Session giao diện, bạn có thể đặt một cách rõ ràng một loại kết quả với addScalar() thay vào đó (cũng có thể truy cập qua unwrap() trong JPA 2.0):

Query q2 = em.createNativeQuery(
    "select sc_cur_code, sc_amount from sector_costs");
q2.unwrap(SQLQuery.class).addScalar("sc_cur_code", StringType.INSTANCE);

Có rất nhiều vấn đề chưa được giải quyết liên quan đến vấn đề này trong Hibernate JIRA, bắt đầu từ HHH-2220.

Đây là lời giải thích của Max Rydahl Andersen từ bình luận của HHH-2220:

Hiện tại Hibernate hỗ trợ một loại ánh xạ "tự động" từ kiểu SQL sang kiểu Hibernate / Java - do có nhiều sự mơ hồ khi thực hiện ánh xạ như vậy, đôi khi nó sẽ không khớp với những gì bạn thực sự muốn.

Đó là lý do tại sao chúng tôi luôn khuyên bạn nên sử dụng addScalar rõ ràng HOẶC nếu bạn không muốn toàn bộ mã của mình sử dụng lớp con của Dialect để chỉ định bạn muốn ánh xạ nào trong số nhiều ánh xạ có thể có.

Vấn đề với CHAR là vấn đề khó khăn nhất, nhưng không dễ sửa - chúng tôi sẽ cần registerType (loại, từ, đến, tên loại) để ánh xạ một phạm vi thay vì một độ dài cụ thể ... nhưng ngay cả khi đó bạn vẫn có thể gặp sự cố thành lập bản đồ không rõ ràng (ví dụ:đôi khi bạn muốn một mảng thời gian khác chuỗi, v.v.) Do đó, sử dụng .addScalar được khuyến nghị cho bất kỳ truy vấn sql gốc nào - tùy thuộc vào việc khám phá tự động sẽ luôn có rủi ro và chỉ nên được sử dụng ở mức tối thiểu.

Nếu bạn có truy vấn gốc của mình được mô tả trong tệp cấu hình ánh xạ Hibernate, thì bạn cần xác định <return-scalar ...> cho mỗi giá trị được trả về. Lưu ý:Bạn phải liệt kê tất cả các giá trị trả về, vì khi bạn xác định rõ ràng các kiểu trả về, tính năng tự động phát hiện sẽ bị tắt và chỉ các cột đã khai báo mới được trả về.

<sql-query name="myQuery">
    <query-param name="days" type="int" />
    <return-scalar column="count" type="int" />
    <return-scalar column="section_name" type="string" />
    <![CDATA[select count(id) as count, section_name from document where days <= :days]]>
</sql-query>



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách xử lý chính xác ngày tháng trong các ràng buộc truy vấn

  2. Cách tăng tốc độ tải dữ liệu từ oracle sql sang pandas df

  3. Làm cách nào để chuyển đổi câu lệnh nối bên ngoài bên trái kế thừa trong Oracle?

  4. 19.3 PDB Đóng ORA-65107 ORA-16078

  5. Chuyển đổi khoảng thời gian thành phút