string.Join
// C#
string.Join(",", yiZhuYCMCs)
// Java
yiZhuYCMCs.stream().collect(Collectors.joining(","))
Concat
//#c
var zhuYuanYZXXList = yiZhuXXSaveDto.AddZhuYuanYZXXList.Concat(yiZhuXXSaveDto.UpdateZhuYuanYZXXList).ToList();
//Java
var zhuYuanYZXXList = Stream.concat(yiZhuXXSaveDto.getAddZhuYuanYZXXList().stream(),yiZhuXXSaveDto.getUpdateZhuYuanYZXXList().stream()).collect(toList());
Any
// c#
list.Any()
// Java
list.stream().anyMatch(element -> true);
// c#
!list.Any()
// Java
list.stream().noneMatch(element->true);
All
// c#
list.All()
// Java
list.stream().allMatch(element->true);
ToList
// 简单转为list
// 写法一
shenQingDanList.stream().toList();
// 写法二
shenQingDanList.stream().collect(Collectors.toList());
// 如果需要对返回的对象进行更多控制,请参照写法二
// 比如根据字段分组
var groupList = shenQingDanXXList.stream().collect(Collectors.groupingBy(s -> s.getShenQingDanDto().getId()));
// 比如集合的元素根据分隔符拼接成字符串
var ids = shouShuHZXXList.stream()
.map(SM_SQ_ShenQingDHZXXDto::getZhuYuanJZID)
.distinct()
.collect(Collectors.joining(","));
Select
// 获取对象中的某一字段
shenQingDanList.stream().map(BaseDto::getId).collect(Collectors.toList());
//采用回调函数,返回对象
List<SM_SQ_NiShouShuXX> list = niShouShuList.stream().map(o -> {
SM_SQ_NiShouShuXX niShouShuXX = new SM_SQ_NiShouShuXX();
niShouShuXX.setZhuCiShouShuMC(o.getZhuShouSBZ() == 1 ? "主手术" : "次手术");
niShouShuXX.setShouShuMCID(o.getShouShuMCID());
niShouShuXX.setShouShuMC(o.getShouShuMC());
niShouShuXX.setShouShuBW(o.getShouShuBW());
niShouShuXX.setQieKouLBDM(o.getQieKouLBDM());
niShouShuXX.setQieKouLBMC(o.getQieKouLBMC());
niShouShuXX.setShouShuJBDM(o.getShouShuJBDM());
niShouShuXX.setShouShuJBMC(o.getShouShuJBMC());
niShouShuXX.setZhuShouShuBZ(o.getZhuShouSBZ());
niShouShuXX.setShouShuMCQZ(o.getShouShuMCQZ());
niShouShuXX.setShouShuMCHZ(o.getShouShuMCHZ());
niShouShuXX.setId(o.getId());
return niShouShuXX;
}).collect(Collectors.toList());
// c#select返回new字段
var xinZengLinChuangXMSs = yiZhuXXSaveDto.AddZhuYuanYZXXList.Where(x => x.LinChuangLJDRBZ == 1 || !string.IsNullOrWhiteSpace(x.LinChuangLJBRXMID)).Select(x => new { x.LinChuangLJDRBZ, x.LinChuangLJBRXMID });
// Java
var xinZengLinChuangXMSs = yiZhuXXSaveDto.getAddZhuYuanYZXXList().stream().filter(o -> o.getLinChuangLJDRBZ() == 1 && !o.getLinChuangLJBRXMID().isEmpty()).map(t->new Object(){
public Integer LinChuangLJDRBZ = t.getLinChuangLJDRBZ();
public String LinChuangLJBRXMID = t.getLinChuangLJBRXMID();
}).collect(Collectors.toList());
Where
List<SM_SQ_ShenQingDMXDto> filteredDMXList = shenQingDMXList.stream()
.filter(x -> Objects.equals(x.getShenQingDID(), s.getId()))
.collect(Collectors.toList());
FirstOrDefault
// 获取集合的第一个对象
// c#
var first = list.FirstOrDefault();
// java
var first = list.findFirst().orElse(null);
// 获取集合的第一个对象的某个属性
// c#
var shouShuMC = list.FirstOrDefault()?.ShouShuMC;
//java
String shouShuMC = list.stream().findFirst().map(SM_SQ_ShenQingDWJZDto::getShouShuMC).orElse("");
Distinct
// 简单用法
var list= list.stream().distinct().toList();
//根据指定属性移除重复的对象
var shouShuHZXXList = ExpressionUtils.removeDuplicateObjects(shouShuHZXXList, SM_SQ_ShenQingDHZXXDto::getZhuYuanJZID);
Order、OrderByDescending
// 根据ZhuShouSBZ字段降序
var niShouShuList = shenQingDMXXX.stream()
.filter(o -> o.getShuHouSSBZ() == 0)
.sorted(Comparator.comparing(SM_SQ_ShenQingDMXModel::getZhuShouSBZ).reversed())
.collect(Collectors.toList());
// 根据ZhuShouSBZ字段升序
var niShouShuList = shenQingDMXXX.stream()
.filter(o -> o.getShuHouSSBZ() == 0)
.sorted(Comparator.comparing(SM_SQ_ShenQingDMXModel::getZhuShouSBZ))
.collect(Collectors.toList());
// 根据多个字段升序
var shiJiSSList = shenQingDMXXX.stream()
.sorted(Comparator.comparing(SM_SQ_ShenQingDMXModel::getZhuShouSBZ)
.thenComparing(SM_SQ_ShenQingDMXModel:: getShenQingDID))
.collect(Collectors.toList());
// java在内存里面排序时里面字段如果是null会报空指针
var yiAnPList = yiAnPList.stream()
.sorted(comparing(SM_SQ_ShenQingDXQDto::getShouShuJDM,
Comparator.nullsLast(String::compareTo))
.thenComparing(SM_SQ_ShenQingDXQDto:: getAnPaiSJ))
.collect(Collectors.toList());
//c#
var chuYuanYZ = checkYiZhuXXs.OrderByDescending(x=>x.KaiShiSJ).FirstOrDefault(o => o.ZuZhiJGID == zuZhiJGID
&& o.ZhuYuanJZID == yiZhuXXSaveDto.ZhuYuanJZID
&& o.YiZhuZTDM != YiZhuZTEnum.YiCheXiao.ToEnumString()
&& o.YiZhuFLDM == YiZhuFLDMEnum.ZhiLiao.ToEnumString()
&& o.YiZhuLXDM == YZ_ZD_YiZhuLX.ChuYuan.ToEnumString());
// Java
var chuYuanYZ = checkYiZhuXXs.stream().filter(o -> zuZhiJGID.equals(o.getZuZhiJGID())
&& yiZhuXXSaveDto.getZhuYuanJZID().equals(o.getZhuYuanJZID())
&& YiZhuConstant.YiZhuZTEnum.YiCheXiao.getDescription().equals(o.getYiZhuZTDM())
&& YiZhuConstant.YiZhuFLDMEnum.ZhiLiao.getDescription().equals(o.getYiZhuFLDM())
&& YiZhuConstant.YZ_ZD_YiZhuLX.ChuYuan.getDescription().equals(o.getYiZhuLXDM()))
.sorted(Comparator.comparing(YZ_ZY_YiZhuXXModel::getKaiShiSJ).reversed()).findFirst().orElse(null);
groupBy casewhen
QSM_ZD_ShuJuYLBModel model = QSM_ZD_ShuJuYLBModel.sM_ZD_ShuJuYLBModel;
Expression<String> alias = new CaseBuilder().when(model.shuJuYLBID.eq("SM0001")).then("001").otherwise("other").as("test");
StringPath cAlias = Expressions.stringPath("test");
JPAQuery<Tuple> jpaQuery = new JPAQueryFactory(entityManager).select(alias, model.count()).from(model);
List<Tuple> fetch = jpaQuery.groupBy(cAlias).fetch();
notExists
@Query
@Query("select s from SM_SQ_ShenQingDanModelTest as s where not exists(select 1 from SM_SQ_ShenQingDanModelTest as s1 where s1.zuZhiJGID=s.zuZhiJGID )")
QueryDSL
QSM_SQ_ShenQingDanModelTest s = QSM_SQ_ShenQingDanModelTest.sM_SQ_ShenQingDanModelTest;
QSM_SQ_ShenQingDanModelTest s1 = new QSM_SQ_ShenQingDanModelTest("s1");
BooleanExpression notExists = new JPAQuery<>(entityManager)
.from(s1)
.where(s1.zuZhiJGID.eq(s.zuZhiJGID))
.notExists();
JPAQuery<SM_SQ_ShenQingDanModelTest> query = new JPAQuery<>(entityManager);
query.select(s).from(s).where(notExists);
List<SM_SQ_ShenQingDanModelTest> result = query.fetch();
??操作符
// C#
var dangQianZTDMs = shouShuZT ?? "";
//java
var dangQianZTDMs = Optional.ofNullable(shouShuZT).orElse("");
判断相等
// 两个对象属性之间的比较使用Objects.equals()方法进行比较
if(Objects.equals(a,b)){
}
// 常量比较的时候,常量需要放到前面
if (ShouMaConstant.SSZT_YIANPAI.equals(shenQingDan.getDangQianZTDM())) {
//...
}
MapTo
// c#
var shouShuGLXQ = row.MapTo<SM_SQ_ShenQingDXQDto, SM_SQ_ShouShuGLXQ>();
// 单个对象自动映射
var shouShuGLXQ = MapUtils.copyProperties(row,SM_SQ_ShouShuGLXQ::new);
var shouShuGLXQ = MapUtils.copyProperties(row,SM_SQ_ShouShuGLXQ::new,(a,b)->{
//...
});
// 集合自动映射
var shenQingDMXList = MapUtils.copyListProperties(shenQingDMXmodelList, SM_SQ_ShenQingDMXDto::new);
Merge
// java
MapUtils.mergeProperties(updateDto, shenQingDXX);
//C# merge 时,忽略医嘱id,医嘱名称
shenQingDan.MergeWithIgnore(updateDto.ShenQingDXX, o => new { o.YiZhuID, o.YiZhuMC });
//JAVA merge 时,忽略医嘱id,医嘱名称
MapUtils.mergeProperties(updateDto.getShenQingDXX(), shenQingDan, (a, b) -> {
b.setYiZhuID(b.getYiZhuID());
b.setYiZhuMC(b.getYiZhuMC());
});
String拼接时 null表现不同
// c#
shouShuSQD.NianLing + shouShuSQD.NianLingDW // 返回 "24岁"
// java
shouShuSQD.NianLing + shouShuSQD.NianLingDW //返回 "24岁null"
// 要改成
StringUtil.join("", jiuZhenXX.getNianLing().toString(), jiuZhenXX.getNianLingDW())
RemoteHelpers
//对应着c#中调用远程后是否调用成功,失败报错(判断code)
var rso = RemoteHelper.getData(yiZhuRemoteService.cheXiaoZYYZ(yiZhuCXDtoList),"医嘱撤销失败");
JPA
官方文档:
- 添加、更新直接调用 xxxxRepository.save(shenQingDXX);仓储的save方法,当实体有id时是修改数据,没有id时是新增数据,不存在await_unitOfWork.SaveChangesAsync();
更新可使用xxxxRepository.asUpdateDsl().set(s -> s.zuZhiJGId, "2").update();
插入新数据可使用: xxxxRepository.insert(shenQingDXX);,相比较save,insert不需要查询之后再判断是否新增,而是直接插入,若存在主键直接报错。 - 软删调用 xxxxxRepository.asDeleteDsl().where(s -> s.zuZhiJGId.eq("1")).execute();如果手写sql的update语句,不会自动更新框架字段,比如更新时间等;
常用的查询写法
// 获取单个实体,Optional<> 表示可选值
Optional<SM_SQ_ShenQingDanModel> findByZuZhiJGIDAndId(String zuZhiJGID, String id);
// 支持手写sql,在获取单个实体别名需要定义为s
@Query("select s from SM_SQ_ShenQingDanModel as s where s.zuZhiJGID = :zuZhiJGID and s.id in :shenQingDIDs")
List<SM_SQ_ShenQingDanModel> findByZuZhiJGIDAndIdIn(String zuZhiJGID,List<String> shenQingDIDs);
// 获取单个实体的自动映射,model-> dto
@Query("select s from SM_SQ_ShenQingDanModel as s where s.zuZhiJGID = :zuZhiJGID and s.id in :shenQingDIDs")
List<SM_SQ_ShenQingDanDto> findByZuZhiJGIDAndIdIn(String zuZhiJGID,List<String> shenQingDIDs);
// 结合valueOf实现自动映射
public class SM_SQ_ShenQingDanDto extends BaseDto {
public static SM_SQ_ShenQingDanDto valueOf(SM_SQ_ShenQingDanModel model) {
return MapUtils.copyProperties(model, SM_SQ_ShenQingDanDto::new);
}
}
// 获取多个实体自动映射
@Query("select new cn.mediinfo.vela.shouma.dto.shenqingdandto.ShenQingDXXDto(a,b) from SM_SQ_ShenQingDanModel as a left join SM_SQ_ShenQingDMXModel as b on a.id = b.shenQingDID and b.zhuShouSBZ = 1 where a.zuZhiJGID = :zuZhiJGID and a.zhuYuanJZID = :zhuYuanJZID")
List<ShenQingDXXDto> findShenQingDanLeftJoinShenQingDMXOnIdEqualShenQingDID(@Param("zuZhiJGID") String zuZhiJGID, @Param("zhuYuanJZID") String zhuYuanJZID);
// 结合调用构造函数实现自动映射
package cn.mediinfo.vela.shouma.dto.shenqingdandto;
public class ShenQingDXXDto {
private SM_SQ_ShenQingDanDto shenQingDanDto;
private SM_SQ_ShenQingDMXDto shenQingDanMXDto;
public ShenQingDXXDto(SM_SQ_ShenQingDanModel shenQingDan, SM_SQ_ShenQingDMXModel shenQingDMX) {
this.shenQingDanDto = SM_SQ_ShenQingDanDto.valueOf(shenQingDan);
this.shenQingDanMXDto = SM_SQ_ShenQingDMXDto.valueOf(shenQingDMX);
}
}
// 查询平铺的字段
@Query("select s.zhuYuanJZID as jiuZhenYWID, count(s) as shuLiang from SM_SQ_ShenQingDanModel as s where s.zhuYuanJZID in :zhuYuanJZIDList and s.dangQianZTDM = '9' group by s.zhuYuanJZID")
List<Map<String,Object>> findByZhuYuanJZIDInGroupByZhuYuanJZID(List<String> zhuYuanJZIDList);
// 需要在Service里把List<Map<String,Object>>类型对象手动转换为dto
var mapList = sm_sq_shenQingDanRepository.findByZhuYuanJZIDInGroupByZhuYuanJZID(zhuYuanJZIDs);
var zhuYuanJZYXList = new ArrayList<SM_SQ_ShenQingDSLByJZYWIDItem>();
for (var map : mapList){
var item = MapUtils.copyMapProperties(map,SM_SQ_ShenQingDSLByJZYWIDItem::new);
zhuYuanJZYXList.add(item);
}
// 分页查询
// sql定义
@Query("select s from SM_ZD_ShuJuYLBModel as s " +
"where (:zuzhiJGID is null or s.zuZhiJGID=:zuzhiJGID) " +
"and (:likeQuery is null " +
"or (s.shuJuYLBMC like %:likeQuery% or s.shuJuYLBID like %:likeQuery% " +
"or (case when :shuRuMLX = '1' then upper(s.shuRuMa1) when :shuRuMLX = '2' then s.shuRuMa2 else s.shuRuMa3 end like %:likeQuery%) ))" +
"order by s.shuJuYLBID asc")
Slice<SM_ZD_ShuJuYLBModel> findTopByZuzhiJGIDAndLikeQuery(@Param("zuzhiJGID") String zuzhiJGID,
@Param("likeQuery") String likeQuery,
@Param("shuRuMLX") String shuRuMLX,
Pageable pageable);
// 分页仓储程序调用
var page = sm_zd_shuJuYLBRepository
.findTopByZuzhiJGIDAndLikeQuery("","","",
PageRequestUtil.of(dto.getPageIndex(),
dto.getPageSize()));
// 取前n条数据
var page = sm_zd_shuJuYLBRepository
.findTopByZuzhiJGIDAndLikeQuery("","","", PageRequestUtil.ofSize(count)));
// SQL左连接转换为程序的一对多的数据结构
// 左连接仓储定义
@Query("SELECT
NEW cn.mediinfo.vela.shouma.dto.shenqingdandto.ShenQingDXXDto(a,
b)
FROM
SM_SQ_ShenQingDanModel AS a
LEFT JOIN SM_SQ_ShenQingDMXModel AS b ON
a.id = b.shenQingDID
AND b.zhuShouSBZ = 1
WHERE
a.zuZhiJGID = :zuZhiJGID
AND a.zhuYuanJZID = :zhuYuanJZID
AND a.dangQianZTDM <> '0'
AND a.dangQianZTDM <> '2'
AND (a.wanChengJZBZ <> 1
OR a.maZuiWCJZBZ <> 0)")
List<ShenQingDXXDto> findShenQingDanLeftJoinShenQingDMXOnIdEqualShenQingDIDByZuZhiJGIDAndZhuYuanJZID(String zuZhiJGID,String zhuYuanJZID);
// JAVA 代码 SQL左连接转换为程序的一对多的数据结构
@Override
public List<SM_SQ_ShenQingDWJZDto> getShouMaWJZSSSQD(String zhuYuanJZID) throws TongYongYWException
{
//排除作废和取消的手术 的所所有未记账的手术
var shenQingDanXXList = shenQingDanRepository
.findShenQingDanLeftJoinShenQingDMXOnIdEqualShenQingDIDByZuZhiJGIDAndZhuYuanJZID(lyraIdentityService.getJiGouID(),zhuYuanJZID);
// 根据主表id分组
Map<String,List<ShenQingDXXDto>> groupList = shenQingDanXXList.stream()
.collect(Collectors.groupingBy(x -> x.getShenQingDanDto().getId()));
var result = new ArrayList<SM_SQ_ShenQingDWJZDto>();
for (var entry : groupList.entrySet()){
var shenQingDXXDto = entry.getValue().stream().findFirst()
.map(ShenQingDXXDto::getShenQingDanDto).get();
var item = MapUtils.copyProperties(shenQingDXXDto,SM_SQ_ShenQingDWJZDto::new);
var zhuShouShu = entry.getValue().stream()
.filter(s->s.getShenQingDanMXDto().getZhuShouSBZ() ==1)
.map(ShenQingDXXDto::getShenQingDanMXDto)
.sorted(comparingInt(SM_SQ_ShenQingDMXDto::getShuHouSSBZ).reversed())
.findFirst().orElse(null);
if(null != zhuShouShu){
item.setShouShuMC(zhuShouShu.getShouShuMC());
item.setShouShuJBMC(zhuShouShu.getShouShuJBMC());
item.setShouShuBW(zhuShouShu.getShouShuBW());
}
result.add(item);
}
return result;
}
/* 用QueryDSL解决C#的
WhereIf、
x =>(string.IsNullOrWhiteSpace(shuJuYLBQueryDto.ZuZhiJGID)
|| x.ZuZhiJGID == shuJuYLBQueryDto.ZuZhiJGID)) 查询条件用
*/
QSM_SQ_ShenQingDanModel shenQingDan= sM_SQ_ShenQingDanModel;
QSM_SQ_ShenQingDMXModel shenQingDMX= QSM_SQ_ShenQingDMXModel.sM_SQ_ShenQingDMXModel;
var factory= new JPAQueryFactory(entityManager);
var query =factory.select(shenQingDan, shenQingDMX)
.from(shenQingDan)
.leftJoin(shenQingDMX)
.on(shenQingDan.id.eq(shenQingDMX.shenQingDID))
.where(shenQingDan.zuZhiJGID.eq(lyraIdentityService.getJiGouID()))
.where(shenQingDMX.shuHouSSBZ.eq(0));
//门诊:申请医生过滤
if("1".equals(weiZhiLB)){
query.where(shenQingDan.shenQingYSID.eq(weiZhiCXBS));
}else if("2".equals(weiZhiLB)){//住院医生:申请科室过滤
query.where(shenQingDan.shenQingKSID.eq(weiZhiCXBS));
}else if("3".equals(weiZhiLB)){//住院护士:病区过滤
query.where(shenQingDan.dangQianBQID.eq(weiZhiCXBS));
}
//手术状态过滤
if(!dangQianZTDMs.isEmpty()){
query.where(shenQingDan.dangQianZTDM.in(dangQianZTDMs));
}
//要求时间过滤
if("1".equals(chaXunLX)){
query.where(shenQingDan.yaoQiuSJ.between(kaiShiSj,jieShuSJ));
}else if("2".equals(chaXunLX)){
//申请时间过滤
query.where(shenQingDan.shenQingSJ.between(kaiShiSj,jieShuSJ));
}else if("3".equals(chaXunLX)){
//安排时间过滤
query.where(shenQingDan.anPaiSJ.between(kaiShiSj,jieShuSJ));
}
// 进行数据查询
var queryResult = query.fetch();
API定义
/**
* 获取手术管理列表
* @param kaiShiSj 开始时间
* @param jieShuSJ 结束时间
* @param jiuZhenYWLX 就诊业务类型【1:门诊; 2:急诊; 3:住院; 4:体检】
* @param chaXunLX 查询类型 1申请与安排 2已完成 3已取消 全部:不传或空
* @param shouShuKSID 手术室 全部:不传或空
* @param shouShuJDM 手术间 全部:不传或空
* @param shenQingKSID 申请科室 全部:不传或空
* @param zhuDaoYSID 主刀医生 全部:不传或空
* @param shouShuLBDM 手术类别 全部:不传或空
* @param shouShuJBDM 手术级别 全部:不传或空
* @param likeQuery 患者姓名/住院号
* @return
*/
@Operation(summary = "获取手术申请单明细列表")
@GetMapping("GetShouShuGLList")
public MsfResponse<List<SM_SQ_ShouShuGLXQ>> getShouShuGLList(@RequestParam(required = false) Date kaiShiSj,
@RequestParam(required = false) Date jieShuSJ,
@RequestParam(required = false) String jiuZhenYWLX,
@RequestParam(required = false) String chaXunLX,
@RequestParam(required = false) String shouShuKSID,
@RequestParam(required = false) String shouShuJDM,
@RequestParam(required = false) String shenQingKSID,
@RequestParam(required = false) String zhuDaoYSID,
@RequestParam(required = false) String shouShuLBDM,
@RequestParam(required = false) String shouShuJBDM,
@RequestParam(required = false) String likeQuery) throws ShuJuCZException, ParseException {
if (kaiShiSj == null || jieShuSJ == null) {
return MsfResponse.fail(XiTongResponseCode.CANSHUYC,"请选择开始日期和结束日期!");
}
return MsfResponse.success(shouShuGLService.getShouShuGLList(kaiShiSj, jieShuSJ, jiuZhenYWLX, chaXunLX, shouShuKSID, shouShuJDM, shenQingKSID, zhuDaoYSID, shouShuLBDM, shouShuJBDM, likeQuery));
}
/**
* 获取数据源值域总数
*
* @param shuJuYLBQueryDto
* @return
* @throws MsfResponseException
*/
@Operation(summary = "获取数据源值域总数")
@GetMapping("GetShuJuYZYCount")
public MsfResponse<Long> getShuJuYZYCount(@ParameterObject SM_ZD_ShuJuYZYQueryDto shuJuYLBQueryDto) throws MsfResponseException {
var result = shuJuYZYService.getShuJuYZYCount(shuJuYLBQueryDto);
return MsfResponse.success(result);
}
/**
* 手术申请单暂存
*
* @param enetity
* @return
* @throws MsfResponseException
* @throws TongYongYWException
*/
@Operation(summary = "手术申请单暂存")
@PostMapping("ZanCunSSSQD")
public MsfResponse<Integer> zuoFeiShenQingDXX(@RequestBody SM_SQ_AddShenQingDDto enetity) throws MsfResponseException,TongYongYWException {
var result = shenQingDanService.zanCunSSSQD(enetity);
return MsfResponse.success(result);
}
零散的
- java不存在匿名对象
迁移技巧
- java不存在扩展函数,除了stream()等操作,一般在xxxUtils或者xxxUtil里面,比如 MapUtils.copyProperties()、StringUtils.hasText()、DateUtil.getYYMMDDHHMMSS(jieShuSJ)、String a = String.valueOf(1);;
- 可以借助ChatGPT帮助我们更快的完成工作,比如:AIchatOS等工具;