首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >@NamedNativeQuery与@SqlResultSetMapping进行非实体映射

@NamedNativeQuery与@SqlResultSetMapping进行非实体映射
EN

Stack Overflow用户
提问于 2018-03-11 22:20:28
回答 1查看 14.8K关注 0票数 11

我一直在用这个post作为例子。我有一个复杂的联接查询(在这里简化)。它从两个表返回一个值子集(以及使用CASE的派生列)。我不认为我需要使用实体注释,因为从我的结果集返回的对象不是我的模式中的实际表。

我想保存的非实体对象来自联接查询的结果:

代码语言:javascript
复制
@SqlResultSetMapping(
           name="myMapping",
           classes={
              @ConstructorResult(
                   targetClass=CarLimitDelta.class,
                     columns={
                        @ColumnResult(name="caseCol"),
                        @ColumnResult(name="colA"),
                        @ColumnResult(name="colB"),
                        }
              )
           }
)
@NamedNativeQuery(name="CarLimitDelta.getCarLimitDelta", 
        resultSetMapping="myMapping", 
        query="SELECT CASE "+ 
           "WHEN t.foo IS NULL THEN 'INS' "+
           "WHEN s.foo IS NULL THEN 'DEL' "+
           "ELSE 'UPD' "+
        "END caseCol "+
     ", T.bar colA "+
     ", S.bar ColB "+
     "FROM tableA S "+
     "FULL JOIN TableB ON S.bar= T.bar")

public class CarLimitDelta {
        private String caseCol;
        private String colA;
        private String colB;


    //getters/setters/etc
    }

我的回购:

代码语言:javascript
复制
@Repository
public interface CarLimitRepository extends CrudRepository<CarLimitDelta, String> {
    List<CarLimitDelta> getCarLimitDelta();
}

我的服务:

代码语言:javascript
复制
@Service
public class CarLimitService {

    @Autowired
    CarLimitRepository carLimitRepository ;

    public void deleteAll() {
        carLimitRepository.deleteAll();
    }

    public List<CarLimitDelta> getCarLimitDelta() {
        return carLimitRepository.getCarLimitDelta();
    }


}

我不知道如何让repo查看在我的CarLimitDelta.getCarLimitDelta中定义的新的NamedNativeQuery原生查询方法。我得到以下错误:

无效的派生查询!没有找到属性getCarLimitDelta类型的CarLimitDelta!

EN

回答 1

Stack Overflow用户

发布于 2018-03-28 13:40:34

@SqlResultSetMapping@NamedNativeQuery注释需要在@Entity上,而不是在非实体POJO上。

如果实体是Foo,那么按如下方式添加注释:

代码语言:javascript
复制
@SqlResultSetMapping(
           name="myMapping",
           classes={
              @ConstructorResult(
                   targetClass=CarLimitDelta.class,
                     columns={
                        @ColumnResult(name="caseCol"),
                        @ColumnResult(name="colA"),
                        @ColumnResult(name="colB"),
                        }
              )
           }
)
@NamedNativeQuery(name="Foo.getCarLimitDelta", 
        resultSetMapping="myMapping", 
        query="...")
@Entity
public class Foo {
  ...
}

请注意,@NamedNativeQuery名称以实体名称作为前缀,例如Foo.getCarLimitDelta

然后将该方法添加到Foo存储库中:

代码语言:javascript
复制
@Repository
public interface FooRepository extends CrudRepository<Foo, String> {
    List<CarLimitDelta> getCarLimitDelta();
}

注意,方法名getCarLimitDelta@NamedNativeQuery名称匹配,减去前缀。

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49225739

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档