Spring Data Projection和Error:"在结果元组中找不到别名!确保您的查询定义了别名!"

gen*_* b. 4 spring jpa spring-data spring-data-jpa

以下从JPA查询获取Spring Data Projection的方法对我不起作用:

/sf/answers/3181064351/

我的桌子:

LOOKUP_T

id   description    display_order_num
------------------------------------
1    Category #1    1
2    Category #2    2
Run Code Online (Sandbox Code Playgroud)

ACTIVITIES_T(activity_category_id映射到LOOKUP_T.id)

id  activity_category_id  activity_title
---------------------------------------
1      2                  Sleeping
2      2                  Eating
3      2                  Travel
Run Code Online (Sandbox Code Playgroud)

Spring Data 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();

}
Run Code Online (Sandbox Code Playgroud)

Spring Data Projection Model接口:

public interface MySpringDataProjection {

    public String getActivityTitle();

    public String getCategory();

    public Integer getCategoryDisplayOrderNum();

}
Run Code Online (Sandbox Code Playgroud)

一切都与接受的答案相同.但是得到这个错误:

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)
Run Code Online (Sandbox Code Playgroud)

我不想select new Obj(..)在Query中使用它,它很脏并且依赖于Hibernate,我们正在抽象出JPA.

我想让这种投影方法起作用.

我引用的(非工作)答案的相关问题, Spring数据JPA:在结果元组中找不到别名!执行自定义查询时出错

小智 7

我遇到了同样的问题.在尝试了几次更改后,我发现我们只需要在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 ")
Run Code Online (Sandbox Code Playgroud)


aja*_*sti 2

我认为您必须在接口中定义确切的名称方法,但我不确定这种方法是否适用于您的情况。

这里重要的一点是这里定义的属性与聚合根中的属性完全匹配。这允许像这样添加查询方法

在您的示例中,您可以尝试开放投影