java - @NamedNativeQuery 和@SqlResultSetMapping 用于非实体

标签 java jpa spring-data-jpa named-query sqlresultsetmapping

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

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

@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
    }

我的 repo :

@Repository
public interface CarLimitRepository extends CrudRepository<CarLimitDelta, String> {
    List<CarLimitDelta> getCarLimitDelta();
}

我的服务:

@Service
public class CarLimitService {

    @Autowired
    CarLimitRepository carLimitRepository ;

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

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


}

我不确定如何让我的存储库看到我的 NamedNativeQuery 中定义的新 CarLimitDelta.getCarLimitDelta native 查询方法。我收到以下错误:

Invalid derived query! No property getCarLimitDelta found for type CarLimitDelta!

最佳答案

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

如果实体是Foo,那么添加注解如下:

@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 存储库中:

@Repository
public interface FooRepository extends CrudRepository<Foo, String> {
    List<CarLimitDelta> getCarLimitDelta();
}

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

关于java - @NamedNativeQuery 和@SqlResultSetMapping 用于非实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49225739/

相关文章:

java - Selenium 测试,在测试期间关闭浏览器连接并重新打开

java - JPQL getResultList 转换为具有比从数据库中选择的更多属性的类

java - 如何将基于Spring Boot 2.0.4构建的项目从mysql5迁移到mysql8?

java - 当从 @Async 方法的 catch block 进行此 JPA 调用时,在 JPA 中使用主键删除单个记录不会生效

java - JPA @Formula 没有架构名称或使用实体类进行配置

spring-data-jpa - JPQL @Query 导致 "unexpected token: ("

java - Android 无法解析构造函数 LineViewGraph

java - 找不到回退方法 : fallback

java - Spring Security 的刷新权限

java - 无法将类型 'java.lang.Integer' 的属性值转换为所需类型