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

Spring数据的自定义保存查询(Hibernate JPA)

蒯硕
2023-03-14

我有两个实体:

ffice.java

 @Entity
    public class WeeklyBoxOffice {

    @NotNull
    private String country;

    @Id
    @NotNull
    private String name;

    @NotNull
    private long weeklyGross;

    @NotNull
    private double weeklyChange;

    @OneToOne//(fetch = FetchType.LAZY, cascade=CascadeType.ALL )
    @JoinColumn(name = "name")
    private Movie movie;
    }

电影JAVA

 @Entity
    @Table(name = "movies")
    public class Movie {

    @Id
    @NotNull
    private String name;

    @NotNull
    private String imageLink;
    }

和以下存储库:

public interface WeeklyBoxOfficeRepository extends   
CrudRepository<WeeklyBoxOffice, String> {
    Iterable<WeeklyBoxOffice> findByCountryOrderByWeeklyGrossDesc(String country);
}

现有的查找方法像左连接一样工作,这正是我需要的。但是如何在不保存电影对象的情况下保存周BoxOffice对象?我真的不知道创建周刊BoxofficeLite的想法。现在它给了一个例外

组织。springframework。刀。InvalidDataAccessApiUsageException:org。冬眠TransientPropertyValueException:对象引用未保存的临时实例-在刷新之前保存临时实例:entity。WeeklyBoxOffice。电影-

是否可以使用NativeQuery for save方法忽略嵌套的电影对象?

共有3个答案

司空锋
2023-03-14

我想你也在用WeeklyBoxOffice JSON发送电影的JSON

{
    "country": "xxxxxx",
    "name": "xxxxxxxx",
    "weeklyGross": "xxxxx",
    "weeklyChange": "xxxxxx",
    "movie": {
        "name": "xxxxxx",
        "imageLink": "xxxxx"
    }
}

所以你必须先创建一个MovierPository并使用这个存储库保存电影,然后使用WeeklyBoxOfficePository保存WeeklyBoxOffice,如下所示

    @Autowired
    WeeklyBoxOfficeRepository weeklyBoxOfficeRepository;
    @Autowired
    MovieRepository movieRepository;
    public WeeklyBoxOffice saveWeeklyBoxOffice(WeeklyBoxOffice weeklyBoxOffice) {
           movieRepository.save(weeklyBoxOffice.getMovie());
           return weeklyBoxOfficeRepository.save(weeklyBoxOffice);
    }

其他解决方案,可以使用CascadeType。全部用于仅使用一行保存此JSON

weeklyBoxOfficeRepository.save(weeklyBoxOffice);

此行将自动保存,并将电影名称(id)分配给weeklyBoxOffice。

凌联
2023-03-14

在调用save()操作之前,为什么不直接将movie字段设置为null
这样,Hibernate将在刷新期间忽略它。

申屠浩歌
2023-03-14

如果您从与电影的关联中删除了级联,那么您不应该得到这个错误,imho。。。

但是不管怎样,也许这个变通方法可以帮助...

public class WeeklyBoxOfficeService {

    @Autoware
    private WeeklyBoxOfficeRepo repo;

    public WeeklyBoxOffice saveWithoutMovie(WeeklyBoxOffice weeklyBoxOffice) {

        weeklyBoxOffice.setMovie(null); // 'unlink' movie from BO
        repo.save(weeklyBoxOffice); // save BO without movie
    }  
}

@RestController
@RequestMapping("/weeklyBoxOffice")
public class WeeklyBoxOfficeController {

    @Autoware
    private WeeklyBoxOfficeService service;

    @PostMapping
    public ResponseEntity<?> saveWithoutMovie(@RequestBody WeeklyBoxOffice weeklyBoxOffice) {

        WeeklyBoxOffice result = service.saveWithoutMovie(weeklyBoxOffice);
        return ResponseEntity.ok(result);
    }
}

 类似资料:
  • 在我的数据库中,我有一个具有以下属性的表“CITA”:id,fecha\u hora,description,id\u empleado,id\u cliente。 我还有一个Spring JPA存储库: 我需要这个查询: 我的问题是我不知道我应该把它放在哪里来还给我像地图这样的东西 因为它不起作用: 编辑 如果我试图从我的REST控制器调用estadistic as(),我有一个错误。 这是我的

  • 在我的Spring Data存储库中,我(必须)使用注释使用自定义查询。我知道我可以限制这样命名查询中的结果数量

  • 问题内容: 我正在尝试从Spring指南创建一个自定义查询:根据参考4.4自定义实现,使用REST访问MongoDB数据。但是我的自定义方法在存储库的REST接口(/ user / search)中不可用。 (例如,浏览器无法找到localhost:8080 / user / search / GetByKidsAge?age = 1) 有人可以帮我解决这个问题并给我一些建议吗?非常感谢 !! 下

  • 我正在尝试将自定义查询添加到Spring Data JDBC CrudRepository,以允许通过备用自然键查找实体。实体有一个 ID,在本例中为 Long,以及一个自然键,即 Reference 类型(基础类型为 UUID)。 我已经创建并注册了从引用到UUID的自定义转换器,反之亦然,并且希望在通过引用查找实体时使用它们。转换在从数据库中提取和存储实体时起作用(Postgres 12.2)

  • 使用Spring Boot应用程序。我有一个类UserService,我在其中创建了一个动态查询,根据请求参数具有多个or条件: 我有UserRepository接口,我需要执行这个查询。到目前为止,我使用了findById等JPA函数或@Query(“从事件中选择id”)。 如何将此查询从服务类传递到存储库并执行它?

  • 我使用jpa存储库进行自定义查询。但我发现了错误 错误日志: 通过字段“login service”表示的不满足的依赖关系;嵌套异常为org.springframework.beans.factory.unsatisfieddependencyexception:创建名为“login service”的bean时出错:通过字段“login serviceimpl”表示的不满足依赖项;嵌套异常为or