2010-04-26 4 views
2

변수를 사용하여 Hibernate에서 네이티브 SQL 쿼리를 사용해야합니다. = mysql을 변수 할당 및 변수 할당을 최대 절전 모드 : 공간이최대 절전 모드에서 MySQL 변수를 사용하는 방법은 무엇입니까?

는 그래서와 충돌이 매개 변수 접두사 이후에 허용되지 않습니다 :

는 그러나 최대 절전 모드 오류가 말을 던졌습니다.

SET @rank:=0; 
UPDATE Rank SET [email protected]:[email protected]+1 ORDER BY Level; 

최대 절전 모드 코드 (JPA 구문) : 여기

내 SQL 쿼리 내 SQL 쿼리를 동적으로 생성되기 때문에

Query query = em.createNativeQuery(theQuery); 
query.executeUpdate(); 

내가 저장 프로 시저를 사용할 수 없습니다 ('레벨 '는'int '또는'force '일 수 있습니다.)

어떻게하면됩니까? Hibernate는 데이터베이스에 쿼리를 전송 한 후

감사

+0

최대 절전 모드 코드를 추가하십시오. –

+0

방금 ​​추가했지만 아주 간단한 일반적인 사례입니다 –

+1

당신은 혼자가 아닙니다. https://forum.hibernate.org/viewtopic.php?f=1&t=992931&start=0 http : // opensource. 어쩌면 order by 절당 하나의 저장 프로 시저가있을 수 있습니다. –

답변

4

음, 마지막에 저장 프로 시저 (예, 제가 처음에 원하지 않는)를 사용 동적 쿼리를 생성합니다 (필자는 불가능하다고 생각합니다).

여기 내 코드입니다 : 저장 프로 시저 :

DELIMITER | 

DROP PROCEDURE IF EXISTS UpdateRank | 

CREATE PROCEDURE UpdateRank(IN shortcut varchar(30)) 
BEGIN 
    SET @rank=0; 
    SET @query=CONCAT('UPDATE Rank SET ', shortcut, '[email protected]:[email protected]+1 ORDER BY ', shortcut);  

    PREPARE q1 FROM @query; 
    EXECUTE q1; 
    DEALLOCATE PREPARE q1; 
END; 

| 
DELIMITER ; 

팁 동적으로 저장 프로 시저에서 쿼리를 만들 수있는 CONCAT 함수의 사용이다.

그런 고전적인 절전 기능의 프로 시저를 호출 :

Query q = em.createNativeQuery("CALL updateRank('lvl')"); 
q.executeUpdate(); 
+1

SQL 삽입을 방지하십시오. –

+0

예, 맞습니다. 이미 보호하고 있습니다. (내 바로 가기는 문자 일뿐입니다) –

+1

Hibernate Interceptor http://stackoverflow.com/questions/9460018/how-can-i에서이 문제에 대한 더 나은 접근 방법을 찾았습니다. -use-mysql-assign-operator-in-hibernate-native-query. 저장 프로 시저를 사용하는 것은 대안이 있다면 끔찍한 생각이라고 생각합니다. –

0

사용 MySQL Proxy 쿼리를 다시 작성합니다. 이와 최대 절전 모드 예를 공급 들어

,

UPDATE Rank SET rank_Level=incr(@rank) ORDER BY Level; 

하지만 그것을 다시,

UPDATE Rank SET [email protected]:[email protected]+1 ORDER BY Level; 
+0

이것은 조금 까다 롭습니다 ... –

+0

HUPHIDATE HARD HATE? – droope

3

을 나는 4.1 최대 절전 할 수있는 점프를 할 수없는 사람들을 위해 https://stackoverflow.com/a/25552002/3987202

또 다른 솔루션에서 내 대답을 붙여 복사 할 수 있습니다. 삼.
/*'*/:=/*'*/을 검색어에 입력하기 만하면됩니다. Hibernate 코드는 ' 사이의 모든 것을 문자열로 처리합니다 (무시합니다). 반면에 MySQL은 작은 따옴표 안의 모든 것을 무시하고 전체 식을 할당 연산자로 평가합니다.
나는 그것이 빠르고 빠르다는 것을 안다.하지만 스토어드 프로 시저, 인터셉터 등을 사용하지 않아도된다.

+0

이 문제가 해결되었습니다. 감사! –

관련 문제