2011-08-30 33 views
22

Tôi đang cố thực hiện xóa hàng loạt đối tượng, Đối tượng địa lý, có mối quan hệ ManyToOne hai chiều với một lớp khác, tính năng FEATMetadata. Tôi đang gặp phải một lỗi SQLGrammerException.Ngoại lệ Hibernate trên Truy vấn chéo MySQL Tham gia

HQL Tôi đang sử dụng:

String hql = "delete from Feature F where F.featuresMetadata.stateGeoId = :stateGeoId"; 

Bật chương trình SQL, sau đây được tạo ra:

delete from FEATURE cross join FEATURESMETADATA featuresme1_ where STATEGEOID=? 

Chạy SQL trực tiếp trong ứng dụng db cho ngoại lệ này:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'cross join FEATURESMETADATA featuresme1_ where stategeoid='01'' at line 1 

Vì SQL được tạo ra đang ném ngoại lệ, tôi đã thử thay đổi phương ngữ từ MySQL5InnoDBDialect thành MySQLInnoDBDialect, nhưng không có thay đổi.

Có ai hỗ trợ không?

+0

Liệu FeaturesMetaData có FK để Tính năng? – Mindfulgeek

+0

Tính năng có FK đối với Tính năngMáy tính. – Jason

Trả lời

34

Bạn có thể không tham gia vào truy vấn HQL như vậy. Trích dẫn từ số reference documentation:

Không được tham gia hoặc ngầm hoặc rõ ràng, có thể được chỉ định trong truy vấn HQL hàng loạt. Các truy vấn phụ có thể được sử dụng trong mệnh đề where, trong đó các truy vấn phụ có thể chứa các tham gia.

Vì vậy, tôi đoán một cái gì đó như thế này nên làm việc:

delete from Feature F where F.id in 
    (select f2.id from Feature f2 where f2.featuresMetadata.stateGeoId = :stateGeoId) 
+0

Doh! Tôi đã đọc nhiều lần và vẫn không nhấp. Đã chấp nhận câu trả lời. – Jason

+6

Xin chào, tôi rất ngạc nhiên vì nó đã làm việc cho bạn kể từ khi tôi nhận được: org.hibernate.exception.GenericJDBCException: Bạn không thể chỉ định bảng đích 'Người dùng' để cập nhật trong mệnh đề FROM. Nó xảy ra vì bạn không thể sửa đổi cùng một bảng mà bạn sử dụng trong phần SELECT (trong trường hợp của bạn - bảng tính năng). Hành vi này được ghi nhận tại: http://dev.mysql.com/doc/refman/5.6/en/update.html. Bất kỳ đề xuất? – forhas

+9

Rất tiếc. Tôi nghĩ rằng HQL là về làm cho các truy vấn đơn giản hơn và hướng đối tượng hơn SQL. Tôi không hiểu tại sao Hibernate không thể tìm ra cách làm thế nào để dịch mối quan hệ giữa các đối tượng thành một truy vấn SQL mà không cần tham gia rõ ràng. –

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