jpa建立视图与实体的映射

其实和实际table 与实体建立映射方式一样

视图 user_view

比如:
我有以下视图:user_view
在这里插入图片描述由于其中几个数据是由其他表统计而来,为了减小代码编写难度,采用视图的方式

实体 UserInfoView

视图对应的实体UserInfoView.java
注意:如果表名与实体不一致,在映射时需要指定name 属性


@Table(name = "user_view")
@Entity

public class UserInfoView {
    @Id
    private Integer id;
    @Column
    private String account;
    @Column
    private String nikeName;
    @Column
    private String photo;
    @Column
    private String about;
    @Column
    private String signature;
    @Column
    private Integer likeCount;
    @Column
    private Integer articleCount;
    @Column
    private Integer visitCount;
    @Column
    private Integer fansCount;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getAccount() {
        return account;
    }

    public void setAccount(String account) {
        this.account = account;
    }

    public String getNikeName() {
        return nikeName;
    }

    public void setNikeName(String nikeName) {
        this.nikeName = nikeName;
    }

    public String getPhoto() {
        return photo;
    }

    public void setPhoto(String photo) {
        this.photo = photo;
    }

    public String getAbout() {
        return about;
    }

    public void setAbout(String about) {
        this.about = about;
    }

    public String getSignature() {
        return signature;
    }

    public void setSignature(String signature) {
        this.signature = signature;
    }

    public Integer getLikeCount() {
        return likeCount;
    }

    public void setLikeCount(Integer likeCount) {
        this.likeCount = likeCount;
    }

    public Integer getArticleCount() {
        return articleCount;
    }

    public void setArticleCount(Integer articleCount) {
        this.articleCount = articleCount;
    }

    public Integer getVisitCount() {
        return visitCount;
    }

    public void setVisitCount(Integer visitCount) {
        this.visitCount = visitCount;
    }

    public Integer getFansCount() {
        return fansCount;
    }

    public void setFansCount(Integer fansCount) {
        this.fansCount = fansCount;
    }
}

dao 定义:


public interface UserInfoViewDao extends CrudRepository<UserInfoView, Integer> {
    UserInfoView findByAccount(String account);

}

测试:

@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j
public class BlogApplicationTests {
    @Autowired
    UserInfoViewDao userInfoViewDao;

     @Test
    public void testViewDao(){
        log.info("view:{}",userInfoViewDao.findByAccount("zhangsan"));
     }
}

效果;

Hibernate: select userinfovi0_.id as id1_12_, userinfovi0_.about as about2_12_, userinfovi0_.account as account3_12_, userinfovi0_.article_count as article_4_12_, userinfovi0_.fans_count as fans_cou5_12_, userinfovi0_.like_count as like_cou6_12_, userinfovi0_.nike_name as nike_nam7_12_, userinfovi0_.photo as photo8_12_, userinfovi0_.signature as signatur9_12_, userinfovi0_.visit_count as visit_c10_12_ from user_view userinfovi0_ where userinfovi0_.account=?
2019-06-07 22:40:48.860  INFO 14128 --- [           main] com.blog.demo.BlogApplicationTests       : view:UserInfoView{id=14, account='zhangsan', nikeName='张三三', photo='太帅无法显示', about='string', signature='随便想一个签名', likeCount=2, articleCount=4, visitCount=3, fansCount=4}

jpa 其实就是hibernate ,但是实现了java 代码查询单表,复杂查询还是推荐使用原生sql
多表分页即需原生sql。
之前我就写过一篇博客记录了在hibernate 中使用了视图-实体映射,现在在jpa由于也是hibernate,那么应该是可以的。

在实现的过程中遇到一个问题:
擅自更改了数据库一个字段名,同时也将实体中的字段属性也作出了相应更改,但是没有改
get,set 方法,导致报错:

javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.MappingException: Could not get constructor for org.hibernate.persister.entity.SingleTableEntityPersister

错误来看是没能创建sesstionfactory,不能找到实体的构造函数额,这个构造可能看的有点疑惑,默认都是有无参构造的,谁能想到是 getXXX方法与属性名不一致导致的

    @Column
    public String getSingnature() {// 应该写成getSignature
        return signature;
    }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章