jpa 中的一对多,多对一关系设置,可直接用findall方法查询出所需的数据,非常方便
2017-09-13 11:09
369 查看
贴一个之前做过的社区(省略get和set): 通过下面的设置,要是你的框架没什么问题的话,就可以直接生成表,表字段,表关系,还可以设置注释,等等,主要是一对多,多对多等关系,一目了然话题表:
/** *话题实体 * *@authorzb * */ @Entity @Table(name=""这里设置表名") publicclassTopicextendsBaseEntity{ privatestaticfinallongserialVersionUID=-337820391660026719L; @Id @GeneratedValue(generator="UIDGenerator") @GenericGenerator(name="UIDGenerator",strategy="com.comtop.msp.framework.persistence.UIDGenerator") @Column(length=40) privateStringtopicId; /**发布时间*/ @Temporal(TemporalType.TIMESTAMP) @JsonFormat(pattern="yyyy-MM-ddHH:mm:ss",timezone="GMT+8") @Column(updatable=true) privateDatepublishDate; /**图片地址*/ @Column(length=100) privateStringimageUrl; /**话题标题*/ @Column(length=80) privateStringtitle; /**说明*/ @Column(length=100) privateStringexplains; /**真实浏览*/ @Column(length=1) privateIntegerrealScan; /**虚拟浏览*/ @Column(length=1) privateIntegerfalseScan; /**排序*/ @Column(length=1) privateIntegersort; /**是否显示*/ @Column(length=1) privateIntegerdisplayStatus; /**所在租户*/ @JoinColumn(name="tenantId") @ManyToOne(optional=true) @JsonIgnore privateTenanttenant; @JsonIgnore @OneToMany(cascade=javax.persistence.CascadeType.ALL,fetch=FetchType.LAZY,mappedBy="topic") privateList<Comments>comments; @JsonIgnore @OneToMany(cascade=javax.persistence.CascadeType.ALL,fetch=FetchType.LAZY,mappedBy="topic") privateList<TopicLike>TopicLike; @Transient privateIntegercommentsCount; @Transient privateIntegersortCount;
评论表:
/** *一级评论实体 * *@authorzb * */ @Entity @Table(name="这里设置表名") publicclassCommentsextendsBaseEntity{ privatestaticfinallongserialVersionUID=-337820391660026719L; @Id @GeneratedValue(generator="UIDGenerator") @GenericGenerator(name="UIDGenerator",strategy="com.comtop.msp.framework.persistence.UIDGenerator") @Column(length=40) privateStringcommentsId; /**话题Id*/ @JoinColumn(name="topicId") @ManyToOne(cascade=CascadeType.REFRESH,optional=true) @JsonIgnore privateTopictopic; /**评论用户id*/ @JoinColumn(name="userId") @ManyToOne(cascade=CascadeType.REFRESH,optional=true) @JsonIgnore privateUseruser; /**评论*/ @Column(columnDefinition="TEXT") privateStringdescription; @JsonIgnore @OneToMany(cascade=javax.persistence.CascadeType.ALL,fetch=FetchType.LAZY,mappedBy="comments") privateList<CommentLike>commentLike; @JsonIgnore @OneToMany(cascade=javax.persistence.CascadeType.ALL,fetch=FetchType.LAZY,mappedBy="comments") privateList<MultistageComments>multistageComments; /**发布时间*/ @Temporal(TemporalType.TIMESTAMP) @JsonFormat(pattern="yyyy-MM-ddHH:mm:ss",timezone="GMT+8") @Column(updatable=true) privateDatepublishDate; /**排序*/ @Column(length=1) privateIntegersort; /**评论点赞数*/ @Column(length=1) privateIntegerlikeCount;}多级回复:
@Entity@Table(name="这里设置")publicclassMultistageCommentsextendsBaseEntity{privatestaticfinallongserialVersionUID=-33820391660026719L;@Id@GeneratedValue(generator="UIDGenerator")@GenericGenerator(name="UIDGenerator",strategy="com.comtop.msp.framework.persistence.UIDGenerator")@Column(length=40)privateStringmultisId;@JoinColumn(name="replyToUserId")@ManyToOne(cascade=CascadeType.REFRESH,optional=true)@JsonIgnoreprivateUserusers;@JoinColumn(name="commentsId")@ManyToOne(cascade=CascadeType.REFRESH,optional=true)@JsonIgnoreprivateCommentscomments;/**评论用户id*/@JoinColumn(name="userId")@ManyToOne(cascade=CascadeType.REFRESH,optional=true)@JsonIgnoreprivateUseruser;@JsonIgnore@OneToMany(cascade=javax.persistence.CascadeType.ALL,fetch=FetchType.EAGER,mappedBy="multistageComments")privateList<CommentLike>commentLike;/**评论*/@Column(columnDefinition="TEXT")privateStringdescription;@Column(length=40)privateStringselfmultisId;/**发布时间*/@Temporal(TemporalType.TIMESTAMP)@JsonFormat(pattern="yyyy-MM-ddHH:mm:ss",timezone="GMT+8")@Column(updatable=true)privateDatepublishDate;}
点赞表:
@Entity@Table(name="这里设置表名")publicclassCommentLikeextendsBaseEntity{privatestaticfinallongserialVersionUID=-3378203916620026719L;//主键id@Id@GeneratedValue(generator="UIDGenerator")@GenericGenerator(name="UIDGenerator",strategy="com.comtop.msp.framework.persistence.UIDGenerator")@Column(length=40)privateStringclId;/**点赞评论id*/@JoinColumn(name="commentsId")@ManyToOne(cascade=CascadeType.REFRESH,optional=true)@JsonIgnoreprivateCommentscomments;/**回复id*/@JoinColumn(name="multisId")@ManyToOne(cascade=CascadeType.REFRESH,optional=true)@JsonIgnoreprivateMultistageCommentsmultistageComments;/**点赞人id*/@JoinColumn(name="likeUserId")@ManyToOne(cascade=CascadeType.REFRESH,optional=true)@JsonIgnoreprivateUseruser;/**被点赞人id*/@JoinColumn(name="bylikeUserId")@ManyToOne(cascade=CascadeType.ALL,optional=true)@JsonIgnoreprivateUserbuser;/**发布时间*/@Temporal(TemporalType.TIMESTAMP)@JsonFormat(pattern="yyyy-MM-ddHH:mm:ss",timezone="GMT+8")@Column(updatable=true)privateDatepublishDate;}
/***根据关键词查询所有记录*关系理清楚之后,贴种通用查询方法,如果没有什么特殊的要求,通常这个方法就能全部搞定了,直接改改就能使用了*@paramkeyword*关键词*@return结果集合*/publicPage<Topic>findByKeyword(finalStringkeyword,intpageNumber,intpageSize){//过滤条件Specification<Topic>spec=newSpecification<Topic>(){@OverridepublicPredicatetoPredicate(Root<Topic>root,CriteriaQuery<?>query,CriteriaBuilderbuilder){List<Predicate>predicates=Lists.newArrayList();if(StringUtils.isNotEmpty(keyword)){PredicatepredicateT=builder.like(root.<String>get("title"),"%/"+keyword+"%",'/');PredicatepredicateP=builder.like(root.<String>get("profile"),"%/"+keyword+"%",'/');PredicatepredicateI=builder.like(root.<String>get("imageUrl"),"%/"+keyword+"%",'/');PredicatepredicateU=builder.like(root.<String>get("url"),"%/"+keyword+"%",'/');predicates.add(builder.or(predicateT,predicateP,predicateI,predicateU));}predicates.add(builder.equal(root.<String>get("delFlag"),Topic.DEL_FLAG_NORMAL));predicates.add(builder.equal(root.<String>get("delFlag"),Comments.DEL_FLAG_NORMAL));root.get("tenant").get("tenantId");Predicatep1=builder.equal(root.get("tenant").get("tenantId"),UserUtils.getTenantId());predicates.add(p1);//将所有条件用and联合起来if(predicates.size()>0){returnbuilder.and(predicates.toArray(newPredicate[predicates.size()]));}returnbuilder.conjunction();}};List<Order>orderList=newArrayList<Order>();orderList.add(newOrder(Direction.DESC,"sort"));orderList.add(newOrder(Direction.DESC,"createDate"));PageRequestpageRequest=newPageRequest(pageNumber-1,pageSize,newSort(orderList));returntopicDao.findAll(spec,pageRequest);}
//下面贴下dao层如何写jpa和原声sql//写原生sql://@Query(value="select*frommsp_topics_multistage_commentswhereselfmultis_id=(?1)",nativeQuery=true)// List<MultistageComments>findMuByselfId(Stringid);//jpa://@Query(value="fromMultistageCommentswherecomments_id=(?1)anddel_flag=0orderbycreate_datedesc")//List<MultistageComments>findByKeywords(Stringkeyword);//nativeQuery=true如果需要分页还是用原声的要方便因为dao层在继承PagingAndSortingRepository对象后后可以直接返回封装后的page对象,//贴一下该对象就知道了
@NoRepositoryBean//page就是封装的分页对象.publicinterfacePagingAndSortingRepository<T,IDextendsSerializable>extendsCrudRepository<T,ID>{/***Returnsallentitiessortedbythegivenoptions.**@paramsort*@returnallentitiessortedbythegivenoptions*/Iterable<T>findAll(Sortsort);/***Returnsa{@linkPage}ofentitiesmeetingthepagingrestrictionprovidedinthe{@codePageable}object.**@parampageable*@returnapageofentities*/Page<T>findAll(Pageablepageable);}ae70
相关文章推荐
- CASE函数 sql server——分组查询(方法和思想) ref和out 一般处理程序结合反射技术统一执行客户端请求 遍历查询结果集,update数据 HBuilder设置APP状态栏
- Linq排序、分组、模糊查询、调用外部方法、直接执行SQL语句、事务、修改数据
- asp.net mvc code first实体关系一对一、一对多、多对多的设置方法
- Jquery如何序列化form表单数据为JSON对象 C# ADO.NET中设置Like模糊查询的参数 从客户端出现小于等于公式符号引发检测到有潜在危险的Request.Form 值 jquery调用iframe里面的方法 Js根据Ip地址自动判断是哪个城市 【我们一起写框架】MVVM的WPF框架(三)—数据控件 设计模式之简单工厂模式(C#语言描述)
- mysql的sql语句中直接计算时间 查询昨天 一周前 一月前 一年前的数据的方法
- EF直接更新数据的另一种方法(不需查询)
- hibernate查询oracle中Date类型数据设置的一种方法
- thinkphp的M方法可以直接使用模型类进行查询,而模型类名字要与数据表对应,模型类中字段不需要写
- mysql的sql语句中直接计算时间 查询昨天 一周前 一月前 一年前的数据的方法
- ALTER TABLE 失败,因为下列 SET 选项的设置不正确:'ARITHABORT'。请确保 SET 选项可正确用于计算列和/或查询通知和/或 xml 数据类型方法的索引视图和/或索引。
- 一个非常方便的查看当前页源码的方法:
- ORACLE中 大数据表的交叉数据集的查询 SQL优化方法
- 利用Repeater控件显示主-从关系数据表的方法
- DataBinder在DataGrid、DataList、Repeater中直接获取数据的方法
- 通过一次查询按类别输出数据的两种方法
- 通过一次查询按类别输出数据的两种方法
- 通过一次查询按类别输出数据的两种方法
- [js].net中表格数据的排序的js应用,非常简单(中国铁路查询)
- 页面之间传递数据方法之一(查询字符串)
- 数据统计例子,相关子查询!(SQL 中循环操作一列数据方法)