您的位置:首页 > 其它

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
                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  jpa
相关文章推荐