首页 文章 精选 留言 我的

精选列表

搜索[抓包过滤],共10000篇文章
优秀的个人博客,低调大师

jpa/hibernate @onetomany 使用left join 添加多条件,可以使用过滤器filters (with-clause...

package com.ipinyou.mip.dataAsset.campaignManagement.entity; import com.ipinyou.mip.utils.NumberUtils; import com.ipinyou.mip.utils.StringHelper; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; import org.apache.commons.lang3.builder.HashCodeExclude; import org.hibernate.annotations.Filter; import javax.persistence.*; import java.text.DecimalFormat; import java.util.HashSet; import java.util.Set; import static javax.persistence.FetchType.EAGER; import static javax.persistence.FetchType.LAZY; @Data @Entity @Table(name = "campaign_dashboard_dimension") @ToString @EqualsAndHashCode public class CampaignDashboardDimensionDo { @Id private Long id; @Transient private Double impRate = 1.0; @Column(name = "3_reach") private Double reach3; @Column(name = "1_reach") private Double reach1; private Long campaignId; @OneToMany(fetch = LAZY, cascade = CascadeType.ALL) @JoinColumn(name = "campaign_dashboard_dimension_id") @org.hibernate.annotations.OrderBy(clause = "imp desc") @Filter(name = "dimension",condition = "dimension_type=:dimension ") private Set<CampaignDashboardDimensionDetailDo> campaignDashboardDimensionDetailDo = new HashSet<>(); } one package com.ipinyou.mip.dataAsset.campaignManagement.entity; import com.ipinyou.mip.utils.NumberUtils; import com.ipinyou.mip.utils.StringHelper; import lombok.Data; import lombok.ToString; import org.hibernate.annotations.FilterDef; import org.hibernate.annotations.OrderBy; import org.hibernate.annotations.ParamDef; import org.hibernate.annotations.Where; import javax.persistence.*; import java.text.DecimalFormat; import static javax.persistence.FetchType.EAGER; @Data @Entity @Table(name = "campaign_dashboard_dimension_detail") @ToString @FilterDef(name="dimension", parameters=@ParamDef(name="dimension",type="java.lang.String")) public class CampaignDashboardDimensionDetailDo { @Id private Long id; private Long version; private java.sql.Timestamp lastModified; private String removed; private Long imp; private Double reachRate; private String dimensionName; private String dimensionType; private Long uv; private Long click; private Double ta = 0.0; @Transient private Double impRate; @Transient private Double diffTa; @Transient private Double diffReach3 = 0.0; @Transient private Double targetTa = 0.0; @Transient private Double targetReach3 = 0.0; } many public List<CampaignDashboardDimensionDo> getCategoryData(List<String> displayType, String dimension, String source, Long campaignId) { List<CampaignDashboardDimensionDo> resultList=new ArrayList<>(); if (displayType==null||displayType.isEmpty()){ return resultList; } for (String type:displayType ){ StringBuilder sb = new StringBuilder(); sb.append("select cdd from CampaignDashboardDimensionDo as cdd left join fetch cdd.campaignDashboardDimensionDetailDo as cddd where cdd.campaignId=:campaignId and cdd.source=:source" + " and cdd.logDate=(select max(logDate) from CampaignDashboardDimensionDo where campaignId=:campaignId and source=:source and displayType=:type) and cdd.displayType=:type"); Filter filter = entityManager.unwrap(Session.class).enableFilter("dimension"); filter.setParameter("dimension",dimension); TypedQuery<CampaignDashboardDimensionDo> query = entityManager.createQuery(sb.toString(), CampaignDashboardDimensionDo.class); query.setParameter("type",type); query.setParameter("source", source); query.setParameter("campaignId", campaignId); List<CampaignDashboardDimensionDo> list = query.getResultList(); Set<CampaignDashboardDimensionDo> set=new HashSet<>(list); resultList.addAll(set); } return resultList; } 查询代码

优秀的个人博客,低调大师

别再把JSF当HTTP:远程调用不背“包”袱!

前言 在我们的日常开发中,RPC(Remote Procedure Call,远程过程调用)扮演着非常重要的角色。它让我们可以像调用本地方法一样调用远程服务,极大地提高了系统的可扩展性和灵活性。然而,我注意到,在日常开发中的很多代码中, 设计JSF接口时,倾向于将返回对象设计得像HTTP请求的响应,包含errorCode、errorMessage、data等字段。 这实际上违背了RPC的设计初衷。RPC的目标是隐藏远程调用的复杂性,使得开发者可以专注于业务逻辑,而不是通信细节。因此,正确的RPC接口设计应该与本地方法的设计一致,返回值简单明了,异常通过抛出异常的方式处理。 今天,我想和大家探讨一下正确的RPC接口设计,希望能对大家有所帮助。 一、走偏的RPC接口设计 1.1 常见的错误方式 很多时候,我们可能会参考HTTP接口的设计,将RPC接口的返回值设计成一个统一的格式,例如: publicclassResult<T> { privateinterrorCode; privateString errorMessage; privateT data; // getters and setters} 然后,我们的RPC方法可能会这样定义: publicResult<User>getUserById(intuserId); 调用方需要先检查errorCode是否为0,再取出data进行业务处理。这种设计看似统一,实际上却增加了调用的复杂度。 1.2 问题何在? 1.2.1 勿忘初衷 首先,我们违背了RPC设计的初衷.设想一下, 当你写一个本地方法, 你会不会返回一个包含errorCode、errorMessage、data的Result对象?当然不会!因为这样做完全没有必要,反而增加了调用的复杂度。 RPC的目的是隐藏网络通信的细节,让远程方法调用看起来像本地方法调用一样。如果我们在接口设计中人为地增加了复杂的返回值结构,就等于自己给自己制造了麻烦。调用方需要额外的代码来解包、检查错误码,这完全没有必要。 如果有异常发生,我们通过抛出异常来处理,这才是符合Java编程习惯的方式。 1.2.2 异常处理不规范 将错误信息通过返回值传递,而不是通过异常机制,会导致异常处理的混乱。 在Java中,异常处理是一个非常重要的机制。它可以帮助我们捕获和处理运行时发生的错误,提高代码的健壮性和可维护性。 当我们把错误信息通过返回值的方式传递时,会发生什么? 1.调用方可能忘记检查错误码:开发者在使用方法时,可能只关注data,而忘记检查errorCode是否为0。这会导致错误被悄悄地忽略,埋下Bug的种子。 2.错误处理分散且不统一:每个方法的错误码可能不同,调用方需要根据不同的errorCode来处理错误,代码变得复杂且难以维护。 3.异常堆栈信息丢失:通过返回值传递错误信息,无法获得完整的异常堆栈,给排查问题带来困难。 还是上面的那个例子: Result<User>result=userService.getUserById(userId);Useruser=result.getData();//如果忘记检查errorCode,这里可能为null 如果errorCode表示用户不存在,但调用方忘记了检查errorCode,直接获取data,那么user可能为null,导致后续代码出现NullPointerException。这种异常与实际错误不符,增加了排查难度。 而使用异常机制,可以强制调用方处理错误: try{ Useruser=userService.getUserById(userId); // 处理业务逻辑}catch(UserNotFoundException e) { // 处理用户不存在的情况} 1.2.3 增加了代码冗余 每个RPC方法都需要返回一个Result对象,调用方需要重复地进行错误码的判断和处理,代码显得繁琐。 当我们使用Result对象作为返回值时,调用方的代码往往充斥着大量的重复性检查,此外,返回Result对象还会导致以下问题: •返回值不统一:有些方法可能返回Result,有些方法返回实际对象,调用方需要记忆每个方法的返回值类型,增加了认知负担。 •不便于方法组合:在函数式编程或流式操作中,Result类型的返回值不便于链式调用,限制了编程的灵活性。 •违反了单一职责原则:方法的职责应该是完成特定的功能,而不是既返回结果又传递错误信息。 代码应该是优雅的、简洁的,而不是充满了冗余和重复。  二. 正确的JSF接口设计原则 既然我们已经了解了将RPC接口设计得像HTTP响应一样存在的问题,那么接下来,就让我们看看如何正确地设计RPC接口。毕竟,找到问题还不够,我们还要找到解决方案,对吧? RPC的魅力就在于:让你忘记网络的存在! 以下举一个查询方法的例子, 比如你要设计一个承运商指标查询的JSF方法, 那么就按照一个本地方法调用去设计就好了: publicinterfaceProviderQueryService{ /** * 查询供应商指标 * *@paramstatisticDate 统计日期 *@paramproviderIdList 供应列表 *@return供应商指标列表 */ List<ProviderRateInfo>queryByDay(Date statisticDate, List<Long> providerIdList)throwsInvalidInputException, SystemRpcException; 这就是我们正常设计一个本地方法的方式, 通过java的异常机制,我们定义出可能的业务异常, 比如入参错误异常, 系统执行异常等等, 然后再调用时, 通过抛出异常来处理错误. try{ List<ProviderRateInfo> res=providerQueryService.queryByDay(statisticDate, providerIdList); // 处理业务逻辑 //todo... }catch(InvalidInputExceptione) { // 处理参数校验错误异常 //todo... }catch(SystemRpcExceptione) { // 处理系统执行异常 //todo... } 为什么要这样做? 1.强制性错误处理:异常机制迫使调用者处理异常,避免错误被忽略。 2.清晰的错误传播路径:异常堆栈信息可以帮助我们快速定位问题所在。 3.统一的错误处理方式:通过异常,可以实现全局的异常处理策略。 此外, 需要说明一下, 对于JSF的系统异常,(如网络异常、超时等),JSF框架会抛出相应的异常,例如RpcException。调用方可以根据需要进行捕获和处理。同时, 在JSF框架中,异常会通过RPC框架进行序列化和传输,调用方可以正常地捕获到服务提供方抛出的异常。 同时返回值也变得简洁了很多, 这样也会待了很多好处: 1.减少代码冗余:不用写大量的if-else和错误码检查。 2.提高可读性:代码更易读,更容易理解方法的功能。 3.方便方法组合:更容易进行方法链式调用或使用函数式编程。  总结 让我们想象一下,代码就像艺术品,每一行都应当简洁、优雅。 如果我们的代码充斥着各种Result、Response、ErrorCode,那就像在一幅美丽的画作上涂抹了太多的颜料,反而失去了原有的美感。 因此,在设计JSF接口时,遵循以下原则: 1.远程调用像本地调用一样简单。 2.充分利用异常机制,统一错误处理。 3.返回值清晰明了,专注于业务数据。 这篇文章抛砖引玉, 希望大家在编写JSF接口时,能有所借鉴, 让我们的代码更加优雅,让我们的系统更加健壮! 扫一扫,加入技术交流群 本文分享自微信公众号 - 京东云开发者(JDT_Developers)。 如有侵权,请联系 support@oschina.cn 删除。 本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册