其实和实际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;
}