2012-10-31 5 views
3

나는 일시적인 속성을 가진 엔티티를 가지고 :액세스 필드

@Entity 
@Table(name = "asset") 
public class Asset { 
    @Transient 
    private String locationIdentifier = "N/A"; 

    @SuppressWarnings("unused") 
    @PostLoad 
    private void onPostLoad() { 
     if (location != null) { 
      locationIdentifier = location.getIdentifier(); 
     } 
    } 

    [other stuffs] 

    } 

나는 locationIdentifier JPA에서이 방법으로 접근을 시도 :

String sqlString = "SELECT asset FROM Asset WHERE asset.locationIdentifier = :inputstr"; 
Query query = entityManager.createQuery(sqlString); 

을하지만, 나는 오류가 발생했습니다 : Cannot resolve the property locationIdentifier

JPQL을 사용하여 locationIdentifier에 액세스하는 방법에 대해 알고 싶습니다.

영어로 죄송합니다. 미리 감사드립니다!

답변

6

JPQL 쿼리는 SQL 쿼리로 변환되고 쿼리 된 SQL은 데이터베이스의 데이터로 작동합니다. 속성 과도 상태를 표시한다는 것은 속성이 데이터베이스에 유지되지 않으며 결과적으로 데이터베이스에서 쿼리 할 수 ​​없음을 의미합니다.

1

@Transient는 JPA에서 속성을 완전히 무시한다는 것을 의미합니다. 쿼리에서 참조 할 수 없습니다.

@Transient을 제거하면 올바르게 작동합니다.

또한, 당신은 쿼리에 매개 변수 값을 제공해야합니다

String sqlString = "SELECT asset FROM Asset WHERE asset.locationIdentifier = :inputstr"; 
Query query = entityManager.createQuery(sqlString); 
query.setParameter("inputstr", someValue); 
+0

'@ Transient'를 제거하면 JPA는 테이블에 해당 열을 생성 할 것이고 필요없는 것을 만들 것입니다. Btw, 정말 고마워. –

+1

불행히도, 그것은 불행입니다. JPA 쿼리에서 사용하려면 DB에 열이 있어야합니다. 그것에 대해 생각해보십시오 - JPA 쿼리는 SQL로 변환되고 DB에서 완전히 실행됩니다. 쿼리는 Java 메모리에서 실행되지 않습니다. SQL 결과 세트는 JPA ORM 맵핑을 사용하여 Java 오브젝트/속성으로 변환됩니다. :-) –

0

어느 당신은 당신의 DB 테이블에 열 locationIdentifier를 추가하고 표시 해제를 과도로, 또는 당신은 쿼리에서이 열을 사용할 수 없습니다.

0

쿼리에서 일시적인 멤버를 사용할 수 없습니다. 그게 말이되지 않습니다! JPQL은 데이터베이스에서 무언가를 얻는 데 사용되며, "locationIdentifier"가 없다면 이것을 where 절에 추가 할 수 없습니다. 데이터베이스 필드가 없다면 SQL에서 무엇을 기대할 수 있습니까?