做技能的逻辑调用是怎么做的

 上传我的文档
 下载
 收藏
毕业于医学院校,在医院工作,有相对丰富的护理经验
 下载此文档
正在努力加载中...
教程用大脚内置技能触发插件自己做技能触发监控
下载积分:2000
内容提示:教程用大脚内置技能触发插件自己做技能触发监控
文档格式:DOC|
浏览次数:321|
上传日期: 12:40:32|
文档星级:
全文阅读已结束,如果下载本文需要使用
 2000 积分
下载此文档
该用户还上传了这些文档
教程用大脚内置技能触发插件自己做技能触发监控
官方公共微信重庆广告执行招聘|重庆广告制作招聘|重庆广告安装招聘 – 汇博人才网
当前选择城市
其他城市正在开通中,敬请期待~
假招聘转招生
回复率&80%
渝中区-解放碑
翼之梦教育信息咨询
广告制作学徒+双休
薪资待遇:
工作地点:渝中区-解放碑
工作经验:不限(可接受应届生)
职位类别:
广告执行/制作/安装
所属行业:
互联网/移动互联网/电子商务
学历要求:大专
年龄性别:26以下(性别不限)
招聘人数:6人
岗位职责:
专为广告门市加工字牌,不外出安装,室内制作
补充说明:
1.为人踏实、吃劳耐劳、有上进心。2.服从管理,虚心学习各项技能3.真正掌握制作技能后,根据各人实际情况进行工资调整
假招聘转招生
渝中区-其他
风库文化传播
广告安装制作
薪资待遇:
工作地点:渝中区-其他
工作经验:1年及以上(可接受应届生)
职位类别:
广告执行/制作/安装
所属行业:
学历要求:不限
年龄性别:27以下(性别不限)
招聘人数:3人
岗位职责:
1、 负责广告片和宣传片的外联和招商;&2、 维持所开发市场的客户关系并不断发展、开发新客户&;3、 负责广告活动化操作与产业链运作;4、 负责把握题材方向,从市场角度指导栏目生产;5、 与公司内部相关部门密切合作&。
补充说明:
1.为人踏实、吃劳耐劳、有上进心。2.服从管理,虚心学习各项技能3.真正掌握制作技能后,根据各人实际情况进行工资调整
回复率&80%
渝北区-加洲新牌坊
索博广告文化传播
薪资待遇:
工作地点:渝北区-加洲新牌坊
工作经验:2年及以上
职位类别:
广告执行/制作/安装
所属行业:
学历要求:大专
年龄性别:年龄不限(性别不限)
招聘人数:1人
岗位职责:
岗位职责:1.负责收集整理各类广告类相关资源及供应商资料;2.负责策划案前期的相关资源调查落实工作,提供公司策划人员所需资源及资源价格,协助其完.策划案报价;3.负责策划案执行过程中各项资源的落实调配工作,按照策划人员对策划案的要求,高质量的完成策划案;4.策划案的执行现场,负责相关工作人员及供应商的分配、管理,保证策划案高效的执行;5.负责策划案执行现场与客户的现场沟通交流,对客户提出的建议及时进行反馈和调整;
补充说明:
任职要求:大专及以上学历,有较强语言沟通能力、责任感者优先考虑;有其他广告相关行业策划案执行经验者,优先考虑;  2、能够熟练使用EXCEL、Word等基本办公类软件;...
沙坪坝区-凤天路
盛世传奇标识
薪资待遇:
工作地点:沙坪坝区-凤天路
工作经验:不限
职位类别:
广告执行/制作/安装
所属行业:
学历要求:大专
年龄性别:年龄不限(性别不限)
招聘人数:2人
岗位职责:
1.根据项目要求,进行现场踏勘、测量、拍照、记录好尺寸,反馈给设计师。2.做好每一个项目的施工计划表:设备工具、安装工期、安装方式、辅材、配件、电源、费用计划、安装工人等。3.对施工工人进行任务量派遣和安装过程的监督。4.能接受不定时加班、具有一定的抗压能力。5.持有C1驾照优先。
假招聘转招生
渝中区-两路口
月薪:(底薪+提成)
华信智原科技
高薪诚聘广告设计师助理+双休
薪资待遇:
(底薪:元/月+提成)
工作地点:渝中区-两路口
工作经验:不限(可接受应届生)
职位类别:
广告执行/制作/安装;
广告执行/制作/安装
所属行业:
互联网/移动互联网/电子商务
学历要求:不限
年龄性别:28以下(性别不限)
招聘人数:6人
岗位职责:
1、忠诚公司、为人真诚、能活跃团队氛围;2、具备团队同合作精神,积极配合设计师完成设计个案;3、有无基础都可以,想获得一份有长远发展、稳定、有晋升空间的工作;4、能完成领导交待的其它任务。
补充说明:
1、大专及以上学历,对设计感兴趣,有长期发展打算;2、有良好的逻辑思维能力、创造力和想像力;&3、具备良好的职业素养及团队合作精神。4、态度较为端正,能适应公司制度,力争上游。5、因公司发展需要,服从公司安排及调动。*PS。我们不需要你有多扎实的技术,甚至你可以没接触过IT行业,我们愿意培养你,我想你一定是勤奋务实的,对吗?我们将对新入职员工进行企业文化、团队合作能力、技能等入职内训,欢迎应...
渝中区-两路口
月薪:(底薪+提成)
凯莱特广告
LED显示屏安装人员
薪资待遇:
(底薪:元/月+提成)
工作地点:渝中区-两路口
工作经验:1年及以上
职位类别:
广告执行/制作/安装
所属行业:
学历要求:不限
年龄性别:40以下(性别不限)
招聘人数:5人
岗位职责:
1、能熟练对较小元器件进行焊锡维修,从事过手机维修者优先。2、LED显示屏安装及软件调试;3、能尽快地学会设备的安装。&4、按时完成公司交付的任务,并与同事紧密配合,共同顺利完成每一项工作任务;5、有相关方面的工作经验优先6、会修单板子,会制作LED显示屏安装及软件调试。
补充说明:
1、要求男性,40岁以下,身体健康,熟练广告制作安装;&2、有较强的学习能力、应变能力、和执行能力;&3、工作严谨,时间观念强、计划性强,善于分析思考问题,有责任心是第一位的;&4、勤奋踏实,良好的服务意识与团队合作精神;&5、会修单板子,会制作LED显示屏安装及软件调试。
回复率&80%
江北区-寸滩
广告执行/制作/安装
薪资待遇:
工作地点:江北区-寸滩
工作经验:不限
职位类别:
广告执行/制作/安装
所属行业:
学历要求:高中
年龄性别:45以下(男)
招聘人数:3人
岗位职责:
岗位职责:1、熟悉各种焊接技术,有焊工证,会开车优先&2、熟悉各种广告字及标识的安装&3、完成领导交办的其他工作&任职资格:1、身体健康,热爱广告行业,具有一定的学习及创新能力2、能够安装各类精品字、树脂字及标识标牌3、会锡焊、氩弧焊、保护焊优先4、吃苦耐劳,抗压力强
补充说明:
试用期短,工资,根据能力拿工资联系人:雷老师联系电话:如有意向,可直接电话联系
南岸区-南坪
汉朗广告策划
薪资待遇:
工作地点:南岸区-南坪
工作经验:不限
职位类别:
广告执行/制作/安装
所属行业:
广告/会展;
学历要求:不限
年龄性别:年龄不限(性别不限)
招聘人数:3人
岗位职责:
职位要求:1、参与汽车行业活动的前期方案讨论,提供专业的市场活动方案。2、发掘、联络和管理各类活动相关的供应商。3、负责监督会场搭建、供应商管理、活动现场执行等相关工作,保证活动顺利进行。4、在活动跟进过程中与客户保持有效的沟通,积极主动地协调、控制、解决突发事件。5、熟悉本地供应商信息,熟知所需材料特性,有较强的成本控制意识。
补充说明:
职位要求:1、参与汽车行业活动的前期方案讨论,提供专业的市场活动方案。2、发掘、联络和管理各类活动相关的供应商。3、负责监督会场搭建、供应商管理、活动现场执行等相关工作,保证活动顺利进行。4、在活动跟进过程中与客户保持有效的沟通,积极主动地协调、控制、...
假招聘转招生
渝中区-两路口
全康纳科技
广告设计助理(双休)
薪资待遇:
工作地点:渝中区-两路口
工作经验:不限(可接受应届生)
职位类别:
广告执行/制作/安装
所属行业:
互联网/移动互联网/电子商务
学历要求:大专
年龄性别:年龄不限(性别不限)
招聘人数:5人
岗位职责:
1、 通过各种渠道收集、整理客户信息,从中挖掘有效信息;2、 客户资料的管理工作,包括数据的收集整理分析,相应产品信息的e-mail,直邮及信息反馈工作;3、 负责部门广告类业务的后勤管理、联络及一些事务性工作;4、 与其它部门之间的沟通、协调工作等。
补充说明:
1、根据能力安排工作,工资3500+/月,每年都有年度调薪;2、五险一金,带薪病假,周末双休,提供住宿,朝九晚六;3、绩效奖金:合理的绩效考核标准,丰厚的绩效奖金,多劳多得。工作时间:早上9点-下午6点&周末双休
回复率&80%
渝北区-两路
广告执行/制作/安装
薪资待遇:
工作地点:渝北区-两路
工作经验:1年及以上
职位类别:
广告执行/制作/安装
所属行业:
学历要求:初中
年龄性别:40以下(男)
招聘人数:2人
岗位职责:
1.熟悉各种户内外物料的材质、制作工艺、制作流程,能辨别物料质量;&2.写真海报及喷绘画面安装、亚克力字、烤漆字及标识标牌的安装等;3.初中以上学历,能吃苦耐劳,热爱本职工作,有较强的团队协作能力;4.会各类广告制作安装,有相关工作经验者,有(驾驶证,焊工有焊工证、电工证)可优先;
回复率&80%
广告执行/制作/安装
薪资待遇:
工作地点:两江新区
工作经验:不限
职位类别:
广告执行/制作/安装
所属行业:
学历要求:不限
年龄性别:年龄不限(性别不限)
招聘人数:2人
岗位职责:
1、负责协助执行活动现场的布置;2、负责活动现场客户的引导;3、完成领导交办的其他任务。
补充说明:
1、对活动现场布置非常熟练;&2、能吃苦、耐心、按照现场负责人要求完成活动策划各项要求;&3、工作积极性高。
项目执行主管
薪资待遇:
工作地点:两江新区
工作经验:3年及以上
职位类别:
广告执行/制作/安装;
所属行业:
学历要求:高中
年龄性别:年龄不限(性别不限)
招聘人数:1人
岗位职责:
1、参与项目的前期筹备阶段,确保供应商体系的有效配合,制定项目预算;2、负责项目的统筹执行、与团队及供应商的联络对接工作;3、展开相关筹备事宜(筹备会议及分工会议),确保团队各项目人员充分配合;4、展开各项统筹安排(场地准备、活动人员组织通知及协调等),灵活机动地处理执行工作及供应商管理,能应对现场突发事件;5、落实活动执行所涉及的物料及人员调配,活动控制以达到预期的目标和效果;6、收集同行业资源,开发优质供应商,定时做汇总分享;7、上级安排的其他工作。
补充说明:
1、熟悉公关及展览展示行业,对重庆市场有一定的了解;2、具备公关活动及展览展示执行经验,有3年以上执行经验;3、执行力强,思维...
南岸区-南山
薪资待遇:
工作地点:南岸区-南山
工作经验:不限
职位类别:
广告执行/制作/安装
所属行业:
影视/演艺/艺术
学历要求:初中
年龄性别:35以下(男)
招聘人数:2人
岗位职责:
1、根据作业标准要求实施生产工作。2、服从部门主管及公司领导相关工作安排。
补充说明:
1、 性格开朗、待人热情,对婚礼行业感兴趣。2、 热爱学习、能吃苦耐劳,有责任心。具体工资待遇:面议(我们提倡多劳多得,只要你有能力、高薪就等着你)注:凡是被我司录用及转正的员工,会享有以下待遇:1、公司免费提供工作餐(早餐、中餐、晚餐)2、公司免费提供住宿条件。3、员工生日公司为员工发放生日纪念品。
南岸区-南山
雕刻机操作
薪资待遇:
工作地点:南岸区-南山
工作经验:1年及以上
职位类别:
广告执行/制作/安装
所属行业:
影视/演艺/艺术
学历要求:初中
年龄性别:35以下(男)
招聘人数:2人
岗位职责:
1、PVC、木板、亚克力、泡沫等雕刻。2、积极配合部门主管实施生产相关工作。
补充说明:
本公司主要从事婚礼道具制作、影视道具制作、商业美陈制作等相关业务,现发展需要急需向社会各界招纳雕刻机操作人员。&&&&&1、从事一年以上雕刻机操作工作经验。&&&&&2、性格开朗、待人热情,对婚礼行业感兴趣。&&&&&3、能吃苦耐劳,有责任心。&&&&&具体工资待遇:面议(我们提倡多劳多得,只要你有能力、高薪就等着你)
南岸区-南山
喷绘、写真机操作
薪资待遇:
工作地点:南岸区-南山
工作经验:2年及以上
职位类别:
广告执行/制作/安装
所属行业:
影视/演艺/艺术
学历要求:不限
年龄性别:35以下(男)
招聘人数:2人
岗位职责:
1、 从事两年以上喷绘、写真机操作工作经验。2、 会使用CorelDRAW及PS软件优先。3、 懂调色、能吃苦耐劳,有责任心。4、 性格开朗、待人热情,对婚礼行业感兴趣。具体工资待遇:面议(我们提倡多劳多得,只要你有能力、高薪就等着你)
南岸区-南山
广告制作学徒工
薪资待遇:
工作地点:南岸区-南山
工作经验:不限
职位类别:
广告执行/制作/安装
所属行业:
影视/演艺/艺术
学历要求:不限
年龄性别:35以下(男)
招聘人数:3人
岗位职责:
任职要求:1、&&&应届毕业生及学工均可;2、对婚礼行业感兴趣者;3、从事过广告制作行业者优先;3、性格开朗、待人热情、敬业精神强者优先;工资待遇:实习期工资2000元/月,包吃住;转正后工资元以上/月,包吃住;注:凡是被我司录用及转正的员工,会享有以下待遇:1、公司免费提供工作餐(早餐、中餐、晚餐)2、公司免费提供住宿条件。3、员工生日公司为员工发放生日纪念品。公司地址:&南岸区南山街道金隅大成南山郡高德/百度地图导航:婚礼工厂公交车路线:南坪方向乘347、346新力村站下车;茶园方向乘177黄桷娅车站下车换346、347新力村站下车。联系人:&严老师...
回复率&80%
永川区-南大街
月薪:(底薪+提成)
底薪:2000
广告制作学徒
薪资待遇:
(底薪:2000元/月+提成)
工作地点:永川区-南大街
工作经验:不限(可接受应届生)
职位类别:
广告执行/制作/安装
所属行业:
出版印刷;
学历要求:高中
年龄性别:年龄不限(性别不限)
招聘人数:3人
岗位职责:
服从上级安排、吃苦耐劳、适应加班和恶劣条件下工作。工作地:永川火火车站肉联厂旁。温馨提示:想短期求财的请绕道
补充说明:
广告行业中怀揣梦想,吃苦耐劳、想在1至3年内在出人头地者优先,月薪2000以上!&&温馨提示:不想在三年内成为专业级广告工程师绕道,可直接联系我:黄先生
南岸区-南坪
月薪:(底薪+提成)
腾讯品牌客户服务专员
薪资待遇:
(底薪:元/月+提成)
工作地点:南岸区-南坪
工作经验:1年及以上(可接受应届生)
职位类别:
广告执行/制作/安装
所属行业:
IT服务/系统集成
学历要求:大专
年龄性别:35以下(女)
招聘人数:5人
岗位职责:
1、&负责配合腾讯大客户销售经理签约新客户、设计签约方案和后续广告投放与跟进,和相关的售后服务;2、配合文案策划人员,分析客户的商业传播目标,整合公司内外部广告资源,为客户提供广告推广计划和方案;3、&积极建设并维护良好、互信的客户关系,挖掘与客户长期深度合作的商业机会;&4、&经培训后能够熟练为客户提供投放报告(结案);&&&&&&&&&&&&&5、有提案能力和文案活动策划能力优先;
补充说明:
1、大专或以上学历,广告、市场营销、新闻传播,汉语语言文学专业优先;&2、1年以上媒介执行和品牌客户服务经验、完成提案和策划与执行的能力;3、工作主动性强,有良好的团队合作能力,良好的沟通能力、学习能...
渝北区-冉家坝
鼎瑞展览展示
广告执行/制作/安装
薪资待遇:
工作地点:渝北区-冉家坝
工作经验:不限(可接受应届生)
职位类别:
广告执行/制作/安装
所属行业:
学历要求:高中
年龄性别:40以下(男)
招聘人数:1人
岗位职责:
1、 有较强责任心,做事认真负责仔细,人品好。2、&&&必须能吃苦耐劳。3、&&&对广告物料的制作及安装熟悉。4、&&&持有C1驾照优先、会开车2年以上驾龄。&5、&&优秀应届生也可
补充说明:
持有C1驾照优先、会开车2年以上驾龄。
回复率&80%
渝中区-大坪
广告执行/制作/安装
薪资待遇:
工作地点:渝中区-大坪
工作经验:不限(可接受应届生)
职位类别:
广告执行/制作/安装
所属行业:
学历要求:不限
年龄性别:年龄不限(性别不限)
招聘人数:2人
岗位职责:
面向没有广告业务经验的可以免费培训,系统化管理运作,享有更加高额的收入分配体系。阶梯式提成,一劳永逸的开发客户长线提成,递增式工资,无责任底薪+年薪+车贴+话费补助+交通补助+无忧保障性的福利待遇。。。。。
补充说明:
面向没有广告业务经验的可以免费培训,系统化管理运作,享有更加高额的收入分配体系。阶梯式提成,一劳永逸的开发客户长线提成,递增式工资,无责任底薪+年薪+车贴+话费补助+交通补助+无忧保障性的福利待遇。。。。。
九龙坡区-其他
月薪:(底薪+提成)
万康盛鼎广告
急聘广告制作安装人员
薪资待遇:
(底薪:元/月+提成)
工作地点:九龙坡区-其他
工作经验:1年及以上
职位类别:
广告执行/制作/安装
所属行业:
学历要求:不限
年龄性别:35以下(男)
招聘人数:5人
岗位职责:
1、熟悉广告公司制作安装流程;2、工作认真负责、服从领导安排、踏实肯干;3、具有良好的沟通能力,有上进心,有团队精神;4、各种物料安装,熟练操作写真机、刻字机等机械者优先。
补充说明:
有经验者优先录用,有驾照者优先录用
渝中区-大坪
月薪:(底薪+提成)
公关活动项目经理
薪资待遇:
(底薪:元/月+提成)
工作地点:渝中区-大坪
工作经验:2年及以上
职位类别:
广告执行/制作/安装
所属行业:
学历要求:不限
年龄性别:35以下(性别不限)
招聘人数:2人
岗位职责:
1、 负责公司活动执行项目的全面管理;2、 负责制定项目工作计划,并执行;3、 负责与客户进行现场协调工作;4、 跟进监督项目执行情况;&5、 服从领导安排!6、能独立做报价,为人细心有责任心!
补充说明:
1从事广告活动公司两年活动执行以上的工作经验2服从领导安排,做事踏实负责任心
渝中区-较场口
薪资待遇:
工作地点:渝中区-较场口
工作经验:1年及以上
职位类别:
广告执行/制作/安装
所属行业:
学历要求:中技/中专
年龄性别:40以下(性别不限)
招聘人数:2人
岗位职责:
1、协助项目负责人执行公关活动2、负责现场搭建,与供应商联络,现场流程把控。4、企业对外公共关系活动的参与和执行;5、活动结束完成活动信息收集,完成活动总结。6、有一定的公关工作经验,有大型公关公司或广告公司工作背景优先;
补充说明:
1、对每个公关活动项目工作的整体负责统筹&部署,执行;2、独立承担项目的能力;3、项目具体执行管理等,包括项目沟通、成本控制、进度控制、质量、风险及人员团队管理等;&4、项目前期沟通,方案期跟进,合同拟定,活动总结,收款等.
回复率&80% &
南岸区-南坪
月薪:(底薪+提成)
薪资待遇:
(底薪:元/月+提成)
工作地点:南岸区-南坪
工作经验:不限
职位类别:
广告执行/制作/安装
所属行业:
学历要求:不限
年龄性别:45以下(男)
招聘人数:2人
岗位职责:
公司各个活动的场地搭建,超市的堆头安装,配合活动执行完成相关工作。
补充说明:
工作认真负责,能够吃苦耐劳,服从公司安排,持C照或B照(手动),驾龄2年以上。会电焊者或从事广告安装工作1年以上者优先。请在工作时间周一至周五8:30-9:30电话咨询,其余时间勿扰。
南岸区-南坪
月薪:(底薪+提成)
薪资待遇:
(底薪:元/月+提成)
工作地点:南岸区-南坪
工作经验:1年及以上
职位类别:
广告执行/制作/安装
所属行业:
学历要求:大专
年龄性别:30以下(性别不限)
招聘人数:2人
岗位职责:
负责伊利活动顺利开展,统筹安排促销工作。
补充说明:
从事过快销品的工作,会文案策划,有创新精神工作认真负责,能够吃苦耐劳。
周边地区招聘:
热门招聘:在 Spring Data Jpa 中使用逻辑删除需做的工作 - 郁也风 - 技术碎片 - ITeye博客
博客分类:
Spring Data 是个好东西,极大简化了后端dao的操作,只需要在 dao 接口写个 findByXXX 的方法就能自动实现按条件查询这个简直太爽了。
不过问题也出现了,我的应用对于数据的操作没有物理删除,全是逻辑删除,也就是每个表都有个字段 deleted,1表示此记录已删除,默认值为 0 。这就与 spring data 提供的模式有冲突了,那剩下的就是:改之。
对于基础的CRUD 操作搞起来比较简单,按照其官方文档重新实现个 factory-class 就ok了,具体的 repository 类可以继承 org.springframework.data.jpa.repository.support.SimpleJpaRepository 进行修改,不过我为了省事,直接把这个类复制过来然后下手:
package mon.base.spring.
import static org.springframework.data.jpa.repository.query.QueryUtils.DELETE_ALL_QUERY_STRING;
import static org.springframework.data.jpa.repository.query.QueryUtils.applyAndB
import static org.springframework.data.jpa.repository.query.QueryUtils.getQueryS
import static org.springframework.data.jpa.repository.query.QueryUtils.toO
import java.io.S
import java.util.ArrayL
import java.util.C
import java.util.L
import javax.persistence.EntityM
import javax.persistence.LockModeT
import javax.persistence.NoResultE
import javax.persistence.TypedQ
import javax.persistence.criteria.CriteriaB
import javax.persistence.criteria.CriteriaQ
import javax.persistence.criteria.P
import javax.persistence.criteria.P
import javax.persistence.criteria.R
import org.springframework.dao.EmptyResultDataAccessE
import org.springframework.data.domain.P
import org.springframework.data.domain.PageI
import org.springframework.data.domain.P
import org.springframework.data.domain.S
import org.springframework.data.jpa.domain.S
import org.springframework.data.jpa.repository.support.JpaEntityI
import org.springframework.data.jpa.repository.support.JpaEntityInformationS
import org.springframework.data.jpa.repository.support.LockMetadataP
import org.springframework.data.jpa.repository.support.SimpleJpaR
import org.springframework.transaction.annotation.T
import org.springframework.util.A
import mon.base.mvc.BaseD
import mon.base.mvc.BaseDefaultM
import mon.utils.StringU
* {@link org.springframework.data.jpa.repository.support.SimpleJpaRepository},
* 提供逻辑删除功能(logicDelete),为适应这个要求,相关的查询也都做了修改。
* 需要注意的是那些 delete 方法仍然是物理删除,而新增的那些 logic 开头的方法才是逻辑删除, 用时候需要注意这点.
* @author wangjxe
@org.springframework.stereotype.Repository
@Transactional(readOnly = true)
public class CustomSimpleJpaRepository&T, ID extends Serializable& implements
BaseDao&T, ID& {
* 逻辑删除字段名.
public final static String DELETEED_FIELD = "deleted";
public static final String COUNT_QUERY_STRING = "select count(%s) from %s x where x.deleted = false";
public static final String EXISTS_QUERY_STRING = "select count(%s) from %s x where x.%s = :id and x.deleted = false";
private final JpaEntityInformation&T, ?& entityI
private final EntityM
// private final PersistenceP
private LockMetadataProvider lockMetadataP
* Creates a new {@link SimpleJpaRepository} to manage objects of the given
* {@link JpaEntityInformation}.
* @param entityInformation
must not be {@literal null}.
* @param entityManager
must not be {@literal null}.
public CustomSimpleJpaRepository(
JpaEntityInformation&T, ?& entityInformation,
EntityManager entityManager) {
Assert.notNull(entityInformation);
Assert.notNull(entityManager);
this.entityInformation = entityI
this.em = entityM
// this.provider = PersistenceProvider.fromEntityManager(entityManager);
* Creates a new {@link SimpleJpaRepository} to manage objects of the given
* domain type.
* @param domainClass
must not be {@literal null}.
* @param em
must not be {@literal null}.
public CustomSimpleJpaRepository(Class&T& domainClass, EntityManager em) {
this(JpaEntityInformationSupport.getMetadata(domainClass, em), em);
* Configures a custom {@link LockMetadataProvider} to be used to detect
* {@link LockModeType}s to be applied to queries.
* @param lockMetadataProvider
public void setLockMetadataProvider(
LockMetadataProvider lockMetadataProvider) {
this.lockMetadataProvider = lockMetadataP
private Class&T& getDomainClass() {
return entityInformation.getJavaType();
private String getDeleteAllQueryString() {
return getQueryString(DELETE_ALL_QUERY_STRING,
entityInformation.getEntityName());
private String getCountQueryString() {
String countQuery = String.format(COUNT_QUERY_STRING,
getCountQueryPlaceholder(), "%s");
return getQueryString(countQuery, entityInformation.getEntityName());
* (non-Javadoc)
* @see org.springframework.data.repository.CrudRepository#delete(java.io.
* Serializable)
@Transactional
public void delete(ID id) {
Assert.notNull(id, "The given id must not be null!");
if (!exists(id)) {
throw new EmptyResultDataAccessException(String.format(
"No %s entity with id %s exists!",
entityInformation.getJavaType(), id), 1);
delete(findOne(id));
* (non-Javadoc)
* org.springframework.data.repository.CrudRepository#delete(java.lang.Object
@Transactional
public void delete(T entity) {
Assert.notNull(entity, "The entity must not be null!");
em.remove(em.contains(entity) ? entity : em.merge(entity));
* (non-Javadoc)
* org.springframework.data.repository.CrudRepository#delete(java.lang.Iterable
@Transactional
public void delete(Iterable&? extends T& entities) {
Assert.notNull(entities, "The given Iterable of entities not be null!");
for (T entity : entities) {
delete(entity);
* (non-Javadoc)
* org.springframework.data.jpa.repository.JpaRepository#deleteInBatch(java
* .lang.Iterable)
@Transactional
public void deleteInBatch(Iterable&T& entities) {
Assert.notNull(entities, "The given Iterable of entities not be null!");
if (!entities.iterator().hasNext()) {
applyAndBind(
getQueryString(DELETE_ALL_QUERY_STRING,
entityInformation.getEntityName()), entities, em)
.executeUpdate();
* (non-Javadoc)
* @see org.springframework.data.repository.Repository#deleteAll()
@Transactional
public void deleteAll() {
for (T element : findAll()) {
delete(element);
* (non-Javadoc)
* org.springframework.data.jpa.repository.JpaRepository#deleteAllInBatch()
@Transactional
public void deleteAllInBatch() {
em.createQuery(getDeleteAllQueryString()).executeUpdate();
* (non-Javadoc)
* org.springframework.data.repository.Repository#readById(java.io.Serializable
public T findOne(ID id) {
Assert.notNull(id, "The given id must not be null!");
return em.find(getDomainClass(), id);
* (non-Javadoc)
* @see org.springframework.data.repository.CrudRepository#exists(java.io.
* Serializable)
public boolean exists(ID id) {
Assert.notNull(id, "The given id must not be null!");
if (entityInformation.getIdAttribute() != null) {
String placeholder = getCountQueryPlaceholder();
String entityName = entityInformation.getEntityName();
String idAttributeName = entityInformation.getIdAttribute()
.getName();
String existsQuery = String.format(EXISTS_QUERY_STRING,
placeholder, entityName, idAttributeName);
TypedQuery&Long& query = em.createQuery(existsQuery, Long.class);
query.setParameter("id", id);
return query.getSingleResult() == 1;
return findOne(id) !=
* (non-Javadoc)
* @see org.springframework.data.jpa.repository.JpaRepository#findAll()
public List&T& findAll() {
return getQuery(null, (Sort) null).getResultList();
* (non-Javadoc)
* @see org.springframework.data.repository.CrudRepository#findAll(ID[])
public List&T& findAll(Iterable&ID& ids) {
return getQuery(new Specification&T&() {
public Predicate toPredicate(Root&T& root, CriteriaQuery&?& query,
CriteriaBuilder cb) {
Path&?& path = root.get(entityInformation.getIdAttribute());
return path.in(cb.parameter(List.class, "ids"));
}, (Sort) null).setParameter("ids", ids).getResultList();
* (non-Javadoc)
* @see org.springframework.data.jpa.repository.JpaRepository#findAll(org.
* springframework.data.domain.Sort)
public List&T& findAll(Sort sort) {
return getQuery(null, sort).getResultList();
* (non-Javadoc)
* org.springframework.data.repository.PagingAndSortingRepository#findAll
* (org.springframework.data.domain.Pageable)
public Page&T& findAll(Pageable pageable) {
if (null == pageable) {
return new PageImpl&T&(findAll());
return findAll(null, pageable);
* (non-Javadoc)
* org.springframework.data.jpa.repository.JpaSpecificationExecutor#findOne
* (org.springframework.data.jpa.domain.Specification)
public T findOne(Specification&T& spec) {
return getQuery(spec, (Sort) null).getSingleResult();
} catch (NoResultException e) {
* (non-Javadoc)
* org.springframework.data.jpa.repository.JpaSpecificationExecutor#findAll
* (org.springframework.data.jpa.domain.Specification)
public List&T& findAll(Specification&T& spec) {
return getQuery(spec, (Sort) null).getResultList();
* (non-Javadoc)
* org.springframework.data.jpa.repository.JpaSpecificationExecutor#findAll
* (org.springframework.data.jpa.domain.Specification,
* org.springframework.data.domain.Pageable)
public Page&T& findAll(Specification&T& spec, Pageable pageable) {
TypedQuery&T& query = getQuery(spec, pageable);
return pageable == null ? new PageImpl&T&(query.getResultList())
: readPage(query, pageable, spec);
* (non-Javadoc)
* org.springframework.data.jpa.repository.JpaSpecificationExecutor#findAll
* (org.springframework.data.jpa.domain.Specification,
* org.springframework.data.domain.Sort)
public List&T& findAll(Specification&T& spec, Sort sort) {
return getQuery(spec, sort).getResultList();
* (non-Javadoc)
* @see org.springframework.data.repository.CrudRepository#count()
public long count() {
return em.createQuery(getCountQueryString(), Long.class)
.getSingleResult();
* (non-Javadoc)
* org.springframework.data.jpa.repository.JpaSpecificationExecutor#count
* (org.springframework.data.jpa.domain.Specification)
public long count(Specification&T& spec) {
return getCountQuery(spec).getSingleResult();
* (non-Javadoc)
* org.springframework.data.repository.CrudRepository#save(java.lang.Object)
@Transactional
public &S extends T& S save(S entity) {
if (entityInformation.isNew(entity)) {
em.persist(entity);
return em.merge(entity);
* (non-Javadoc)
* org.springframework.data.jpa.repository.JpaRepository#saveAndFlush(java
* .lang.Object)
@Transactional
public T saveAndFlush(T entity) {
T result = save(entity);
* (non-Javadoc)
* org.springframework.data.jpa.repository.JpaRepository#save(java.lang.
* Iterable)
@Transactional
public &S extends T& List&S& save(Iterable&S& entities) {
List&S& result = new ArrayList&S&();
if (entities == null) {
for (S entity : entities) {
result.add(save(entity));
* (non-Javadoc)
* @see org.springframework.data.jpa.repository.JpaRepository#flush()
@Transactional
public void flush() {
em.flush();
* Reads the given {@link TypedQuery} into a {@link Page} applying the given
* {@link Pageable} and {@link Specification}.
* @param query
must not be {@literal null}.
* @param spec
can be {@literal null}.
* @param pageable
can be {@literal null}.
private Page&T& readPage(TypedQuery&T& query, Pageable pageable,
Specification&T& spec) {
query.setFirstResult(pageable.getOffset());
query.setMaxResults(pageable.getPageSize());
Long total = getCountQuery(spec).getSingleResult();
List&T& content = total & pageable.getOffset() ? query.getResultList()
: Collections.&T& emptyList();
return new PageImpl&T&(content, pageable, total);
* Creates a new {@link TypedQuery} from the given {@link Specification}.
* @param spec
can be {@literal null}.
* @param pageable
can be {@literal null}.
private TypedQuery&T& getQuery(Specification&T& spec, Pageable pageable) {
Sort sort = pageable == null ? null : pageable.getSort();
return getQuery(spec, sort);
* Creates a {@link TypedQuery} for the given {@link Specification} and
* {@link Sort}.
* @param spec
can be {@literal null}.
* @param sort
can be {@literal null}.
private TypedQuery&T& getQuery(Specification&T& spec, Sort sort) {
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery&T& query = builder.createQuery(getDomainClass());
Root&T& root = applySpecificationToCriteria(spec, query);
query.select(root);
if (sort != null) {
query.orderBy(toOrders(sort, root, builder));
return applyLockMode(em.createQuery(query));
* Creates a new count query for the given {@link Specification}.
* @param spec
can be {@literal null}.
private TypedQuery&Long& getCountQuery(Specification&T& spec) {
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery&Long& query = builder.createQuery(Long.class);
Root&T& root = applySpecificationToCriteria(spec, query);
query.select(builder.count(root));
return em.createQuery(query);
* Applies the given {@link Specification} to the given
* {@link CriteriaQuery}.
* @param spec
can be {@literal null}.
* @param query
must not be {@literal null}.
private &S& Root&T& applySpecificationToCriteria(Specification&T& spec,
CriteriaQuery&S& query) {
Assert.notNull(query);
Root&T& root = query.from(getDomainClass());
CriteriaBuilder builder = em.getCriteriaBuilder();
// 增加了删除条件判断,从而将被逻辑删除的数据过滤掉
Predicate deletedPredicate =
if (BaseDefaultModel.class.isAssignableFrom(getDomainClass())) {
Path&Boolean& deletedPath = root.&Boolean& get(DELETEED_FIELD);
deletedPredicate = builder.isFalse(deletedPath);
if (spec == null) {
// 没有其它条件的时候只判断deleted字段
query.where(deletedPredicate);
Predicate predicate = spec.toPredicate(root, query, builder);
if (predicate != null) {
// 存在其它条件的时候还需要组合一下 deleted 条件
if (null != deletedPredicate) {
predicate = builder.and(predicate, deletedPredicate);
query.where(predicate);
private TypedQuery&T& applyLockMode(TypedQuery&T& query) {
LockModeType type = lockMetadataProvider == null ? null
: lockMetadataProvider.getLockModeType();
return type == null ? query : query.setLockMode(type);
* (non-Javadoc)
* @see mon.base.mvc.BaseDao#logicDelete(java.io.Serializable)
public void logicDelete(ID id) {
T entity = findOne(id);
if (null == entity || !(entity instanceof BaseDefaultModel)) {
BaseDefaultModel model = (BaseDefaultModel)
model.setDeleted(true);
this.em.merge(model);
* (non-Javadoc)
* @see mon.base.mvc.BaseDao#logicDelete(java.lang.Object)
public void logicDelete(T entity) {
if (null == entity || !(entity instanceof BaseDefaultModel)) {
BaseDefaultModel model = (BaseDefaultModel)
model.setDeleted(true);
if (StringUtil.isBlank(model.getId())) {
em.persist(model);
em.merge(model);
* (non-Javadoc)
* @see mon.base.mvc.BaseDao#logicDelete(java.lang.Iterable)
public void logicDelete(Iterable&? extends T& entities) {
if (null == entities) {
for (T entity : entities) {
logicDelete(entity);
protected String getCountQueryPlaceholder() {
return "x";
主要的改动是 applySpecificationToCriteria 方法,与 SimpleJpaRepository 比对下就知道改了啥了。
findByXXX 操作
CURD 的修改还是比较简单的,不过那些根据接口方法自动实现查询修改起来就比较麻烦了。当然,不做任何修改也可以用,只需要在dao接口的方法上面加个 @Query 就行了,但是这样就需要写大量的jpql了,与采用 spring data的原意不符,咱用这玩意目的不就是为了个简单嘛。
本来的想法是继承某些类来对需要调整的方法重新实现就ok了,可惜spring data 这块的实现有点太封闭了,多个类没有 public,只能包内可见,更多的需要的方法只提供了 private 属性。没办法,只好把 org.springframework.data.jpa.repository.query 包内的代码都拷贝过来,其实真正需要改动的地方只有一处:
mon.base.spring.data.plete(Predicate, Sort, CriteriaQuery&Object&, CriteriaBuilder, Root&?&)
具体修改方法如下:
protected CriteriaQuery&Object& complete(Predicate predicate, Sort sort,
CriteriaQuery&Object& query, CriteriaBuilder builder, Root&?& root) {
// 增加了删除条件判断,从而将被逻辑删除的数据过滤掉
Predicate deletedPredicate =
if (BaseDefaultModel.class.isAssignableFrom(this.domainClass)) {
Path&Boolean& deletedPath = root.&Boolean& get(CustomSimpleJpaRepository.DELETEED_FIELD);
deletedPredicate = builder.isFalse(deletedPath);
// 在原有条件基础上组合 deleted 条件
if (null != deletedPredicate) {
predicate = builder.and(predicate, deletedPredicate);
return this.query.select(root).where(predicate)
.orderBy(QueryUtils.toOrders(sort, root, builder));
收工走人。。。
浏览 17012
浏览: 48987 次
来自: 上海
springdata jpa相关demo源代码下载,地址:ht ...
谢谢分享,不知道现在有没有更好的办法,透明系统也自带一个,an ...
最近我也在做这个事情,我想问下如何让自己定义的JpaQuery ...
本身就是变态的做法}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信