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

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

夹谷星河
2023-03-14

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

然而,问题开始出现,它们是两方面的:

>

  • 当试图设置正确的注释时。视图没有与之相关联的主键,但没有适当的javax。坚持不懈Id注释在字段上,您将获得一个组织。冬眠AnnotationException:没有为运行时抛出的实体指定标识符。

    Spring BootJpaRepository接口定义要求ID类型扩展Serializable,这排除了使用java.lang.Void作为视图实体上缺少id的解决方案。

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

  • 共有3个答案

    南门向荣
    2023-03-14

    我希望这对你有所帮助,你可以在你的观点中把它分配给一个统一的值。

    我们将视图映射到JPA对象,如下所示:

    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.Id;
    import javax.persistence.Table;
    import java.io.Serializable;
    
    @Entity
    @Table(name = "my_view")
    public class MyView implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Column(name = "my_view_id")
    private Long myViewId;
    @NotNull
    @Column(name = "my_view_name")
    private String myViewName;
    }
    

    然后,我们创建一个存储库:

    import org.springframework.data.jpa.repository.JpaRepository;
    
    public interface MyViewRepository extends JpaRepository<View, Long> {
    }
    
    段干弘扬
    2023-03-14

    1、在数据库中用原生SQL创建视图,

    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);
    }
    
    郏景澄
    2023-03-14

    我也在探讨这个话题。最后,我在本机查询中使用了基于Spring数据JPA接口的投影。

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

    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();
    
    }
    
     类似资料:
    • 问题内容: 我正在尝试为视图创建JPA实体。在数据库层中,表和视图应该相同。 但是,问题开始出现并且有两个方面: 尝试设置正确的注释时。视图没有与之关联的主键,但是如果没有对字段进行适当的注释,则会在运行时引发抛出异常。 Spring Boot 接口定义要求类型为extends ,这避免了由于视图实体上缺少ID 而不能用作替代方法。 与缺少主键的视图进行交互的正确JPA / SpringBoot

    • 我有一个springboot项目,为了执行请求,我正在连接到我的mysql数据库。我有一个实体ExportBatch: 我在ExportBatchRepository中定义了一个新方法: 在我的控制器里,我是这样做的: 当我调用“/GetLastBatchsProblemes”时会遇到这个异常:java.lang.ClassCastException:[Ljava.lang.Object;不能强制

    • 是否有一种方法可以使通用Spring数据JPA存储库正确处理类似的方法?例如只返回狗,而不返回所有动物?或者至少,最好的变通方法是什么? 它的工作几乎完美,保存每一个动物在自己的桌子上,等等。唯一的问题是:同时返回水豚和狗。这个答案解释说: 这只有在域类使用单表继承时才起作用。我们在引导时能得到的关于domain类的唯一信息是它将是Product对象。因此,对于像findAll()甚至findBy

    • 问题内容: 每次访问数据库记录时,什么是最合适的和最有效的存储视图计数的方法? 我有包含以下字段的表: 每个项目都有自己的永久链接:http : //domain.com/item_name 我希望能够使用此数据并在页面上显示一个。哪种方法最好? 方法一 在表中创建一个附加字段,并对其进行更新以增加视图计数: 方法B 创建一个包含以下字段的新表: 并在每次查看页面时将新记录添加到表中。 方法C 完

    • 我在使用JPA时遇到了一些困难。我没有得到任何异常,但我不能保存任何东西到数据库。我从Hibernate到Jpa,在那里一切都工作得很好。下面是我的文件 Application.Properties: 存储库: 服务: 我在提交表单时得到了200的响应,但在数据库中找不到数据

    • 它是否将其存储在缓存中?我有一个应用程序,但应用程序中没有任何地方。属性是提到的db详细信息。我可以通过邮递员存储数据和查询它。