jpa 中的一对多,多对一关系设置,可直接用findall方法查询出所需的数据,非常方便

贴一个之前做过的社区(省略get和set):

  通过下面的设置, 要是你的框架没什么问题的话,就可以直接生成表,表字段,表关系,还可以设置注释,等等, 主要是一对多,多对多等关系, 一目了然

话题表 :

/**
 * 话题实体
 * 
 * @author zb
 *
 */
@Entity
@Table(name = ""这里设置表名")
public class Topic extends BaseEntity{
	private static final long serialVersionUID = -337820391660026719L;

	@Id
	@GeneratedValue(generator = "UIDGenerator")
	@GenericGenerator(name = "UIDGenerator", strategy = "com.comtop.msp.framework.persistence.UIDGenerator")
	@Column(length = 40)
	private String topicId;
	
	 /** 发布时间  */
    @Temporal(TemporalType.TIMESTAMP)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @Column(updatable = true)
    private Date publishDate;

	/** 图片地址 */
	@Column(length = 100)
	private String imageUrl;

	/** 话题标题 */
	@Column(length = 80)
	private String title;

	/** 说明 */
	@Column(length = 100)
	private String explains;

	/** 真实浏览 */
	@Column(length = 1)
	private Integer realScan;

	/** 虚拟浏览 */
	@Column(length = 1)
	private Integer falseScan;

	/** 排序 */
	@Column(length = 1)
	private Integer sort;

	/** 是否显示 */
	@Column(length = 1)
	private Integer displayStatus;

	/** 所在租户 */
	@JoinColumn(name = "tenantId")
	@ManyToOne(optional = true)
	@JsonIgnore
	private Tenant tenant; 
	

	@JsonIgnore
	@OneToMany(cascade=javax.persistence.CascadeType.ALL, fetch = FetchType.LAZY, mappedBy="topic")
	private List<Comments> comments;
	
	@JsonIgnore
	@OneToMany(cascade=javax.persistence.CascadeType.ALL, fetch = FetchType.LAZY, mappedBy="topic")
	private List<TopicLike> TopicLike;
	
	 @Transient 
	private Integer commentsCount;
	 
	 @Transient
	private Integer sortCount;
	
	
评论表:
/**
 * 一级评论实体
 * 
 * @author zb
 *
 */
@Entity
@Table(name = "这里设置表名")
public class Comments extends BaseEntity {
	private static final long serialVersionUID = -337820391660026719L;

	@Id
	@GeneratedValue(generator = "UIDGenerator")
	@GenericGenerator(name = "UIDGenerator", strategy = "com.comtop.msp.framework.persistence.UIDGenerator")
	@Column(length = 40)
	private String commentsId;

	/** 话题Id */

	@JoinColumn(name = "topicId")
	@ManyToOne(cascade = CascadeType.REFRESH, optional = true)
	@JsonIgnore
	private Topic topic;

	/** 评论用户id */
	@JoinColumn(name = "userId")
	@ManyToOne(cascade = CascadeType.REFRESH, optional = true)
	@JsonIgnore
	private User user;

	/** 评论 */
	@Column(columnDefinition = "TEXT")
	private String description;

	
	@JsonIgnore
	@OneToMany(cascade=javax.persistence.CascadeType.ALL, fetch = FetchType.LAZY, mappedBy="comments")
	private List<CommentLike> commentLike;
	
	
	@JsonIgnore
	@OneToMany(cascade=javax.persistence.CascadeType.ALL, fetch = FetchType.LAZY, mappedBy="comments")
	private List<MultistageComments>  multistageComments;

	 /** 发布时间  */
  	  @Temporal(TemporalType.TIMESTAMP)
  	  @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
  	  @Column(updatable = true)
   	 private Date publishDate;
    

	/** 排序 */
	@Column(length = 1)
	private Integer sort;

	/** 评论点赞数 */
	@Column(length = 1)
	private Integer likeCount;

	


   
   
}
 
多级回复:
@Entity
@Table(name = "这里设置 ")
public class MultistageComments extends BaseEntity {

	private static final long serialVersionUID = -33820391660026719L;

	@Id
	@GeneratedValue(generator = "UIDGenerator")
	@GenericGenerator(name = "UIDGenerator", strategy = "com.comtop.msp.framework.persistence.UIDGenerator")
	@Column(length = 40)
	private String multisId;

	@JoinColumn(name = "replyToUserId")
	@ManyToOne(cascade = CascadeType.REFRESH, optional = true)
	@JsonIgnore
	private User users;

	@JoinColumn(name = "commentsId")
	@ManyToOne(cascade = CascadeType.REFRESH, optional = true)
	@JsonIgnore
	private Comments comments;

	/** 评论用户id */
	@JoinColumn(name = "userId")
	@ManyToOne(cascade = CascadeType.REFRESH, optional = true)
	@JsonIgnore
	private User user;

	@JsonIgnore
	@OneToMany(cascade = javax.persistence.CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "multistageComments")
	private List<CommentLike> commentLike;

	/** 评论 */
	@Column(columnDefinition = "TEXT")
	private String description;
	
	@Column(length = 40)
	private String selfmultisId;
	
  
	
	 /** 发布时间  */
    @Temporal(TemporalType.TIMESTAMP)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @Column(updatable = true)
    private Date publishDate;
   
}
点赞表:
@Entity
@Table(name = "这里设置表名")
public class CommentLike extends BaseEntity {

	private static final long serialVersionUID = -3378203916620026719L;

	// 主键id
	@Id
	@GeneratedValue(generator = "UIDGenerator")
	@GenericGenerator(name = "UIDGenerator", strategy = "com.comtop.msp.framework.persistence.UIDGenerator")
	@Column(length = 40)
	private String clId;

	/** 点赞评论id */
	@JoinColumn(name = "commentsId")
	@ManyToOne(cascade = CascadeType.REFRESH, optional = true)
	@JsonIgnore
	private Comments comments;

	
	/** 回复 id */
	@JoinColumn(name = "multisId")
	@ManyToOne(cascade = CascadeType.REFRESH, optional = true)
	@JsonIgnore
	private MultistageComments multistageComments;
	
	
	/** 点赞人id */
	@JoinColumn(name = "likeUserId")
	@ManyToOne(cascade = CascadeType.REFRESH, optional = true)
	@JsonIgnore
	private User user;

	/** 被点赞人id */
	@JoinColumn(name = "bylikeUserId")
	@ManyToOne(cascade = CascadeType.ALL, optional = true)
	@JsonIgnore
	private User buser;

	
	 /** 发布时间  */
    @Temporal(TemporalType.TIMESTAMP)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @Column(updatable = true)
    private Date publishDate;
	}

       /**
	 * 根据关键词查询所有记录
	 * 关系理清楚之后,贴种通用查询方法,如果没有什么特殊的要求,通常这个方法就能全部搞定了,直接改改就能使用了
	 * @param keyword
	 *            关键词
	 * @return 结果集合
	 */
	public Page<Topic> findByKeyword(final String keyword, int pageNumber, int pageSize) {
		// 过滤条件
		Specification<Topic> spec = new Specification<Topic>() {

			@Override
			public Predicate toPredicate(Root<Topic> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
				List<Predicate> predicates = Lists.newArrayList();
				if (StringUtils.isNotEmpty(keyword)) {
					Predicate predicateT = builder.like(root.<String> get("title"), "%/" + keyword + "%", '/');
					Predicate predicateP = builder.like(root.<String> get("profile"), "%/" + keyword + "%", '/');
					Predicate predicateI = builder.like(root.<String> get("imageUrl"), "%/" + keyword + "%", '/');
					Predicate predicateU = 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");  
        		Predicate p1 = builder.equal(root.get("tenant").get("tenantId"), UserUtils.getTenantId()); 
        		predicates.add(p1);
				// 将所有条件用 and 联合起来
				if (predicates.size() > 0) {
					return builder.and(predicates.toArray(new Predicate[predicates.size()]));
				}
				return builder.conjunction();
			}
		};
		List<Order> orderList = new ArrayList<Order>();
		orderList.add(new Order(Direction.DESC, "sort"));
		orderList.add(new Order(Direction.DESC, "createDate"));
		PageRequest pageRequest = new PageRequest(pageNumber - 1, pageSize, new Sort(orderList));
		return topicDao.findAll(spec, pageRequest);
	}


//下面贴下dao层如何写jpa 和 原声sql
 //写原生sql:
 //@Query(value = "select * from  msp_topics_multistage_comments where selfmultis_id =(?1) " ,nativeQuery=true )
//	List<MultistageComments> findMuByselfId(String id);
//jpa:
//@Query(value = "from MultistageComments  where comments_id = (?1)  and del_flag=0  order by create_date desc")
//    List<MultistageComments> findByKeywords(String keyword);


//nativeQuery=true  如果需要分页还是用原声的要方便  因为dao层在继承PagingAndSortingRepository 对象后后可以直接返回封装后的page对象,
//贴一下 该对象就知道了 



@NoRepositoryBean //page就是封装的分页对象.
public interface PagingAndSortingRepository<T, ID extends Serializable> extends CrudRepository<T, ID> {

	/**
	 * Returns all entities sorted by the given options.
	 * 
	 * @param sort
	 * @return all entities sorted by the given options
	 */
	Iterable<T> findAll(Sort sort);

	/**
	 * Returns a {@link Page} of entities meeting the paging restriction provided in the {@code Pageable} object.
	 * 
	 * @param pageable
	 * @return a page of entities
	 */
	Page<T> findAll(Pageable pageable);
}









  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值