복붙노트

[SPRING] 스프링 데이터 투영 및 오류 : "결과 튜플에서 별칭을 찾을 수 없습니다! 쿼리가 별칭을 정의하는지 확인하십시오! "

SPRING

스프링 데이터 투영 및 오류 : "결과 튜플에서 별칭을 찾을 수 없습니다! 쿼리가 별칭을 정의하는지 확인하십시오! "

JPA Query에서 Spring Data Projection을 얻는 접근법이 저에게는 효과적이지 않습니다.

https://stackoverflow.com/a/45443776/1005607

내 테이블 :

LOOKUP_T

id   description    display_order_num
------------------------------------
1    Category #1    1
2    Category #2    2

ACTIVITIES_T (activity_category_id는 LOOKUP_T.id에 매핑 됨)

id  activity_category_id  activity_title
---------------------------------------
1      2                  Sleeping
2      2                  Eating
3      2                  Travel

이 조인에서 특정 필드를 가져 오기위한 스프링 데이터 DAO 인터페이스 :

@Repository
public interface ActivitiesDAO extends JpaRepository<ActivitiesT, Integer> {

    @Query("select a.activityTitle, l.description as category, " + 
           "l.displayOrderNum as categoryDisplayOrderNum " + 
           "from ActivitiesT a, LookupT l " + 
           "where a.lookupT.id = l.id order by l.displayOrderNum asc ")
    public List<MySpringDataProjection> findCustom();

}

스프링 데이터 투영 모델 인터페이스 :

public interface MySpringDataProjection {

    public String getActivityTitle();

    public String getCategory();

    public Integer getCategoryDisplayOrderNum();

}

모든 것은 그 받아 들인 대답과 같습니다. 그러나이 오류가 발생하는 경우 :

org.springframework.dao.InvalidDataAccessApiUsageException: No aliases found in result tuple! Make sure your query defines aliases!; nested exception is java.lang.IllegalStateException: No aliases found in result tuple! Make sure your query defines aliases!
    org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:381)
    org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:489)
    org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:59)
    org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:213)

나는 Select에서 새로운 Obj (..)를 사용하고 싶지 않다. 그것은 더러워서 우리가 JPA에 추상화하고있는 Hibernate에 의존한다.

나는이 Projection 접근 방식을 작동시키고 싶다.

내가 언급 한 (비 작동) 대답을 가진 관련 질문, Spring 데이터 JPA : get 결과 튜플에서 별칭을 찾지 못했습니다! 사용자 지정 쿼리를 실행할 때의 오류

해결법

  1. ==============================

    1.나는 같은 문제를 겪는다. 몇 가지 변경을 시도한 후에 NativeQuery에서 각 열에 "as"를 추가해야합니다 (열 이름도 변경되지 않음). 당신을 위해, 같은 SQL을 변경하십시오 :

    나는 같은 문제를 겪는다. 몇 가지 변경을 시도한 후에 NativeQuery에서 각 열에 "as"를 추가해야합니다 (열 이름도 변경되지 않음). 당신을 위해, 같은 SQL을 변경하십시오 :

        @Query("select a.activityTitle **as activityTitle**, l.description as category, " + 
           "l.displayOrderNum as categoryDisplayOrderNum " + 
           "from ActivitiesT a, LookupT l " + 
           "where a.lookupT.id = l.id order by l.displayOrderNum asc ")
    
  2. ==============================

    2.인터페이스에서 정확한 이름 메서드를 정의해야한다고 생각하지만이 접근법이 해당 사례에 적용되는지 확신 할 수 없습니다.

    인터페이스에서 정확한 이름 메서드를 정의해야한다고 생각하지만이 접근법이 해당 사례에 적용되는지 확신 할 수 없습니다.

    귀하의 예에서는 오픈 투영을 시도 할 수 있습니다.

  3. ==============================

    3.나는 같은 문제가 있었고 나는 그것을 해결한다고 생각한다. 내가 한 것은 동일한 이름을 가지고 있더라도 모든 필드에서 별칭을 사용하는 것입니다. activityTitle에서도 별칭을 사용하십시오. 이렇게 :

    나는 같은 문제가 있었고 나는 그것을 해결한다고 생각한다. 내가 한 것은 동일한 이름을 가지고 있더라도 모든 필드에서 별칭을 사용하는 것입니다. activityTitle에서도 별칭을 사용하십시오. 이렇게 :

    @Repository
    public interface ActivitiesDAO extends JpaRepository<ActivitiesT, Integer> {
    
        @Query("select a.activityTitle as activityTitle, l.description as category, " + 
               "l.displayOrderNum as categoryDisplayOrderNum " + 
               "from ActivitiesT a, LookupT l " + 
               "where a.lookupT.id = l.id order by l.displayOrderNum asc ")
        public List<MySpringDataProjection> findCustom();
    
    }
    
  4. from https://stackoverflow.com/questions/47420600/spring-data-projection-and-error-no-aliases-found-in-result-tuple-make-sure-y by cc-by-sa and MIT license