用于数据库视图(不是表)的 JPA/SpringBoot Repository

新手上路,请多包涵

我正在尝试为视图创建一个 JPA 实体。从数据库层来说,表和视图应该是一样的。

然而,问题开始出现,它们有两个方面:

  1. 尝试设置正确的注释时。视图没有与之关联的主键,但如果没有正确的 @javax.persistence.Id 在字段上注释,您将在运行时抛出 org.hibernate.AnnotationException: No identifier specified for entity

  2. The Spring Boot JpaRepository interface definition requires that the ID type extends Serializable , which java.lang.Void as a work-around for the lack视图实体上的 id。

与缺少主键的视图进行交互的正确 JPA/SpringBoot/Hibernate 方法是什么?

原文由 Paul FREAKN Baker 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.5k
2 个回答

我也在探索那个话题。我最终将基于 Spring Data JPA 接口的投影 与本机查询一起使用。

我创建了一个接口,确保大写部分与数据库列名称匹配:

 public interface R11Dto {

   String getTITLE();

   Integer getAMOUNT();

   LocalDate getDATE_CREATED();
}

然后我为一个与视图没有任何关系的实体(用户)创建了一个存储库。在该存储库中,我创建了一个简单的本机查询。 vReport1_1 是我的观点。

 public interface RaportRepository extends JpaRepository<User, Long> {

   @Query(nativeQuery = true, value = "SELECT * FROM vReport1_1 ORDER BY DATE_CREATED, AMOUNT")
   List<R11Dto> getR11();

}

原文由 Robert Niestroj 发布,翻译遵循 CC BY-SA 4.0 许可协议

1.在数据库中用原生SQL创建View,

 create or replace view hunters_summary as
select
em.id as emp_id, hh.id as hh_id
from employee em
inner join employee_type et on em.employee_type_id = et.id
inner join head_hunter hh on hh.id = em.head_hunter_id;

2. 将视图映射到“不可变实体”

 package inc.manpower.domain;

import org.hibernate.annotations.Immutable;
import org.hibernate.annotations.Subselect;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import java.io.Serializable;
import java.util.Date;

@Entity
@Immutable
@Table(name = "`hunters_summary`")
@Subselect("select uuid() as id, hs.* from hunters_summary hs")
public class HuntersSummary implements Serializable {

    @Id
    private String id;
    private Long empId;
    private String hhId;

    ...
}

3.现在用你想要的方法创建存储库,

 package inc.manpower.repository;

import inc.manpower.domain.HuntersSummary;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.stereotype.Repository;

import javax.transaction.Transactional;
import java.util.Date;
import java.util.List;

@Repository
@Transactional
public interface HuntersSummaryRepository extends PagingAndSortingRepository<HuntersSummary, String> {
    List<HuntersSummary> findByEmpRecruitedDateBetweenAndHhId(Date startDate, Date endDate, String hhId);
}

原文由 Janitha Madushan 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题