JPA/hibernate @joincolumns 联合主键关联 https://blog.csdn.net/paristao/article/details/20534399 这里我有2个entity,用过id1 + id2 映射 首先JPA 要求联合主键必须注册一个PK 类,自己override hashcode/equal方法 Class ProjectId { int departmentId; long projectId; } @Entity @IdClass(ProjectId.class) public class Project { @Id int departmentId; @Id long projectId; : } 然后在引用类中用joincolums关联 @JoinColumns ({ @JoinColumn(name="id1",referencedColumnName = "id1",insertable = false, updatable = false), @JoinColumn(name="id2",referencedColumnName = "id2",insertable = false, updatable = false) }) private Hits hits; 开始的时候没有声明,一直遇到错误。后来发现documentation跟interface都声明了default = true。 所以如果只是关联嵌入某张table,应该声明成false --Hibernate中@Embedded和@Embeddable注解的使用 https://blog.csdn.net/lmy86263/article/details/52108130 多条件聚合查询 https://blog.csdn.net/mengyinjun217/article/details/78356027?utm_source=blogxgwz6 @PersistenceContext private EntityManager em; CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); CriteriaQuery query = criteriaBuilder.createQuery(Integer.class); Root root = query.from(BossOrder.class); List predicates = new ArrayList(); query.select(criteriaBuilder.sum(root.get("orderAmount"))); Path $delFlag = root.get("delFlag"); Predicate _delFlag = criteriaBuilder.equal($delFlag, CommonConstants.DEL_FLAG_FALSE); if(findOrderTableRequest.getOrderStatus() != null){ Path $orderStatus = root.get("orderStatus"); Predicate _orderStatus = criteriaBuilder.equal($orderStatus, findOrderTableRequest.getOrderStatus()); predicates.add(_orderStatus); }else{ Path $orderStatus = root.get("orderStatus"); Predicate _orderStatus = criteriaBuilder.notEqual($orderStatus, OrderStatus.UNPAID); predicates.add(_orderStatus); } Predicate[] p = new Predicate[predicates.size()]; query.where(criteriaBuilder.and(_delFlag,criteriaBuilder.and(predicates.toArray(p)))); Integer singleResult = entityManager.createQuery(query).getSingleResult(); List sumAmountList = bossExpertAmountDao.sumAmount(); Object[] sumAmount = sumAmountList.get(0); apiReturn.setTotalIncome(((BigDecimal)sumAmount[0])); apiReturn.setTotalBalance(((BigDecimal)sumAmount[1])); apiReturn.setTotalTransferBalance(((BigDecimal)sumAmount[2])); apiReturn.setTotalFreezingAmount(((BigDecimal)sumAmount[3])); apiReturn.setCode(CommonConstants.ReturnCode.SUCCESS); @Query(value = "SELECT SUM(income),SUM(balance),SUM(transfer_balance),SUM(freezing_amount) " + "FROM boss_expert_amount " + "WHERE del_flag = '0'",nativeQuery = true) List sumAmount();