2010-02-27 2 views
1

Google App Engine 프로젝트의 일부로 DataNucleus와 협력 중이며 지속적으로 열에 문제가 있습니다. DataNucleus Enhancer, JDO 및 열 이름 지정

@PrimaryKey(column = "user_id") 
@Column(name = "user_id") 
@Persistent(name = "user_id", column = "user_id", valueStrategy = IdGeneratorStrategy.IDENTITY) 
private Key m_id; 

@Column(name = "user_name") 
@Persistent(name = "user_name", column = "user_name") 
private String m_userName; 

당신이 말할 수없는 경우

, 나는 내가 두 명명 규칙을 (하나 하나는 SQL에서 더 잘 작동, 자바에서 잘 작동)가 있기 때문에 변수의 이름과 다른 열 뭔가 이름을 시도하고있다. 어쨌든, 나는 그 마커 주석의 모든 변화를 시도했다하지만 DataNucleus 증강 그들 중 하나를 존중하기를 거부, 그래서 나는이 같은 쿼리를 실행하면

:

Query q = pm.newQuery(User.class, 
         "user_name == _username"); 

나는 항상이 같은 오류가 발생합니다

org.datanucleus.store.appengine.FatalNucleusUserException : 쿼리를 구문 분석하는 동안 예기치 않은 표현식 유형. 개체에 user_name이라는 필드가 있는지 확실합니까? A는이 같은 쿼리를 실행 물론

는 :

Query q = pm.newQuery(User.class, 
         "m_userName == _username"); 

... 모든 것이 잘 작동합니다. 따라서 해당 주석 중 하나라도 존경을 받았다면 user_name이라는 필드가 있지만 분명히 그렇지 않습니다.

SO 내 질문은 : 내가 필드의 이름에서 쿼리에서 사용하는 토큰을 분리 할 수있는 방법이 있습니까? 내가 직접 쿼리를 편집하지 않고 필드의 이름을 변경하는 기능을 찾고 있어요.

참고 : 자바 클래스에서 SQL 명명 규칙을 사용하는 것은 엄청난 양의 XML을 직접 작성하는 것보다 빠릅니다. 주석을 사용하여이 작업을 수행해야합니다.

답변

2

SQL에 대한 이야기가 없으므로 GAE/J를 사용하고 있으므로 BigTable과 RDBMS가 아니므로 SQL은 제대로 작동하지 않습니다. @Column은 ORM 용이므로 아무 것도하지 않습니다. 여기서는 쿼리 언어 인 JDOQL을 사용하므로 객체 지향 쿼리 언어이므로 필드 이름을 사용합니다. 이것은 SQL이 아닙니다. 너 "이"혐오 야? JDOQL은 Java 구문을 사용하므로 "this"는 많은 의미가 있습니다.

리팩터링을 허용하는 유형 안전 쿼리 확장을 실제로 원할 경우 QueryDSL은 DataNucleus와 함께 사용할 JDOQL을 제공합니다.

PS DataNucleus 향상 프로그램은 열 이름과 아무 관련이 없습니다. JDO 스펙에 따라 필드에 대한 갱신을 감지하기위한 추가 메소드를 추가합니다.

+0

다음은 Querydsl의 홈페이지입니다. http://source.mysema.com/display/querydsl/Querydsl –

1

귀하의 문제는 100 % 확실하지 않습니다. 쿼리에 m_userName을 사용하면 SQL 쿼리에 user_name으로 번역됩니까?

Java 클래스 이름과 변수에 따라 쿼리를 표현하면 SQL 스키마 테이블 및 열 이름에 따라 작동하도록 변환됩니다. 그것은 사람들이 원하는 대부분의 시간입니다.

BTW, m_idm_userName은 Java 코드의 끔찍한 명명 규칙입니다. 평소대로 convention을 따르는 것이 좋습니다.

+0

아, 알겠습니다 ... 그래서 주석이 실제로하는 일을 오해했습니다.실제 백킹 열은 여전히 ​​비공개 멤버의 이름으로 쿼리하는 동안 주석으로 이름이 지정됩니다. 그런 종류의 캡슐화가 아닌가요? 내 말은, 이제 모든 문자열 쿼리를 검색하고 직접 변경하지 않고도 변수 이름을 자유롭게 변경할 수는 없습니다. 검색어에 사용하는 단어를 비공개 회원의 이름과 분리 할 수있는 방법이 있습니까? 죄송합니다. 'm_' 대회에서 전환하지 않으므로'this '라고 불쾌감을 느낍니다. –

+0

필드 대신 getter 및 setter 주석을 달 수 있다고 생각합니다. 그럼에도 불구하고 getter와 setter의 이름을 바꾸면 쿼리에만 국한되지 않고 코드에 큰 영향을 미칠 수 있습니다. 리팩터링 도구는 메소드를 참조하는 모든 위치를 문자열을 비롯한 일관된 방식으로 변경하는 데 도움이 될 수 있습니다. – ewernli