当前位置: 首页 > 知识库问答 >
问题:

@非实体的带有@SqlResultSetMapping的NamedNaviQuery

孟财
2023-03-14

我一直以这篇文章为例。我有一个复杂的连接查询(这里简化了)。它返回来自两个表(以及使用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
    }

我的回购:

@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();
    }


}

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

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

共有1个答案

郦磊
2023-03-14

< code > @ SqlResultSetMapping 和< code>@NamedNativeQuery批注需要在< code>@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,与@namedNavity名称匹配,减去前缀。

 类似资料:
  • 我试图理解javax.persistence注释@onetoone、@manytoone和@manytomany。这些注释的描述提到了。具体来说: [@OneToOne]:如果关系是双向的,则非拥有方必须使用OneToOne注释的mappedBy元素来指定拥有方的关系字段或属性。 [@manytoone]:如果关系是双向的,那么非所有者OneToMany实体端必须使用mappedBy元素来指定作为

  • 我们正在尝试将应用程序从Spring迁移到Quarkus Spring。我们可以根据需要重新编写应用程序逻辑。问题来了,因为我们正在使用共享的spring罐,这是传统的,而且数量很多。大多数spring JAR都使用@Autowired使用依赖项注入,但被注入的相应类没有@Component注释。 将用示例描述问题: 类“MyProject”属于Quarkus应用程序 类OtherLevelOne

  • 问题内容: 我正在使用Spring Cache,在这里传递一组键,返回的是实体列表。我想让缓存框架了解返回列表中的每个元素都将与相应的代码一起缓存。目前看来,键是整个列表,如果我在随后的调用中缺少键,它将尝试重新加载整个集合。 另一个可能性是返回的是地图,类似地,我希望缓存足够智能,以仅查询以前从未查询过的项目,还可以使用键将每个项目缓存。 假设国家/地区类别如下所示: Spring Cache有

  • 我正在尝试使用PostgreSQL 9.1和PostGIS 1.5使用GlassFish 4创建一个JPA实体。 我已经通过在 domain/lib 目录中添加 和 jar 来创建/配置了一个数据源。 我已经创建了一个简单的实体< code>MyPoint来处理PostGIS点: 和一个带有方法的点主页,如下所示: 在战争部署中,将创建包含列和的表。列类型为。这是表架构: 问题是在实体管理器上调用

  • 我遇到了jOOQ不插入实体的问题,除非存储库用@Transactional注释。 这是我的配置: 存储库: 因此,调用userRepository。插入(…) 实际上并没有插入到数据库中,尽管日志显示以下内容: 但是,如果我重载User道的插入方法并用@Transacational-it works注释它,实际上会插入行。我想我配置错误了一些东西。 使用带有jOOQ启动启动器的Spring Boo