2013-12-17 11 views
5

Ten błąd wystąpił podczas próby zaktualizowania danych przy użyciu natywnego kodu SQL. To jest mój skrypt:Hibernate: nie można wykonać natywnego zapytania manipulacji zbiorczej

update weight_note_receipt set pledge_id =:pledge where wn_id in (:wns) 

wns jest ciąg znaków, który zawiera więcej niż 1 wn_id tak:

222,226,228,251,256,262,263,264,265,266,267,272,281,286,294,296,299,301,302,303,306,307,330,332,333,337,338,339,341,368,371,376,377,378,379,380,381,385,391,397,423,424,443,452,454,461,462,463,464,490,503,504,521,525,528,529,530,532,533,549,554,560,561,564,565,566,567,569,570,595,598,600,603,605,606,607,644,646,649,653,661,662,663,667,669,678,683,752,1039,1075,258,259,260,261,268,269,270,287,304,305,308,325,334,604,643,647,648,659,660,664,665,666,704,709,753,754,757,758,809,834,846,861,872,879,882,911,913,916,919,920,164 

Kiedy aktualizować (używając query.executeUpdate()), to rzuca się następujący błąd:

Request processing failed; nested exception is org.hibernate.exception.DataException: could not execute native bulk manipulation query] with root cause com.mysql.jdbc.MysqlDataTruncation: Data truncation: Truncated incorrect DOUBLE value: '222,226,228,251,256,262,263,264,265,266,267,272,281,286,294,296,299,301,302,303,306,307,330,332,333,337,338,339,341,368,371,376,'

Czy to dlatego, że ciąg wejściowy jest zbyt długi?

Odpowiedz

10

Po sparametryzowaniu zapytań w bazach danych (przygotowanych instrukcji), przypisanie wartości do parametrów NIE MOŻE zmienić struktury i ścieżki wykonania zapytania (w przeciwnym razie bazy danych nie będą traktować ich jako sparametryzowanych zapytań i wyrzucą wyjątek).

Dlatego nie można mieć przygotowane sprawozdanie dla zapytań takich jak:

  • select * from myTable order by ?
  • select id, f1, ? from myTable
  • select * from ?.

ponieważ przypisanie wartości do każdego parametru zmienia ścieżkę wykonywania zapytania (pamiętaj, że zapytanie przygotowanych instrukcji zostało przetworzone raz i powoduje wykonanie pojedynczej ścieżki wykonania).

Te same reguły dotyczą parsera zapytań Hibernuj, nie należy przypisywać parametru wartości zmieniającej strukturę zapytania.

Przypisywanie ciąg z wartościami 1, 2, 3 do A powinien-to-be-a-number parametrów jest tak samo, w rzeczywistości pierwsze zapytanie zostanie przetłumaczony tak samo jak update weight_note_receipt set pledge_id =:pledge where wn_id = :wns ale druga będzie tłumaczony jako update weight_note_receipt set pledge_id =:pledge where (wn_id = :x1 or wn_id = :x2 or wn_id = :x3), oczywiście różne zapytania o różnych ścieżkach wykonania.

Więc nawet jeśli Hibernate nie rzucił wyjątku, twoja baza danych by.

+2

Nadal nie rozumiem, ale twoje rozwiązanie działało dobrze, bardzo dziękuję –

+0

A jaki jest pozostały problem? –

+0

teraz rozumiem, wielkie dzięki, –

1

Jeśli używasz interfejsu API SQLQuery Hibernate, możesz użyć metody setParameterList(PARAM, COLLECTION).

Twój ciąg zapytania może pozostać niezmieniony z klauzulą ​​i klamrami in.

+1

MUSI pozostać taka sama. Bez nawiasów nie zadziała. – John

Powiązane problemy