电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

springboot 之jpa高級查詢操作

瀏覽:5日期:2023-03-26 16:21:29

springboot的jpa可以根據方法名自動解析sql 非常方便, 只需要在 dao接口中定義方法即可;

下面是一個 demo

package com.bus365.root.dao; import java.io.Serializable;import java.util.List; import org.springframework.data.jpa.repository.JpaRepository;import org.springframework.data.jpa.repository.JpaSpecificationExecutor;import org.springframework.data.jpa.repository.Query;import org.springframework.data.repository.query.Param; import com.bus365.root.model.User; public interface UserDao extends JpaRepository<User,Long>,JpaSpecificationExecutor<User>,Serializable { User findByName(String name); User findByNameAndAge(String name, Integer age); User findByNameOrAge(String name, Integer age); /*@Query(value = 'from User where name = :name') List<User> findbyname(@Param('name') String name);*/}

下面展示service層調用:

@Override public User findByName(String name) { User user = userDao.findByName(name); return user; } @Override public User findByNameAndAge(String name, Integer age) { User user = userDao.findByNameAndAge(name,age); return user; } @Override public User findByNameOrAge(String name, Integer age) { User user = userDao.findByNameOrAge(name,age); return user; }

具體的關鍵字,使用方法和生產成SQL如下表所示

Keyword Sample JPQL snippet And findByLastnameAndFirstname … where x.lastname = ?1 and x.firstname = ?2 Or findByLastnameOrFirstname … where x.lastname = ?1 or x.firstname = ?2 Is,Equals findByFirstnameIs,findByFirstnameEquals … where x.firstname = ?1 Between findByStartDateBetween … where x.startDate between ?1 and ?2 LessThan findByAgeLessThan … where x.age < ?1 LessThanEqual findByAgeLessThanEqual … where x.age ⇐ ?1 GreaterThan findByAgeGreaterThan … where x.age > ?1 GreaterThanEqual findByAgeGreaterThanEqual … where x.age >= ?1 After findByStartDateAfter … where x.startDate > ?1 Before findByStartDateBefore … where x.startDate < ?1 IsNull findByAgeIsNull … where x.age is null IsNotNull,NotNull findByAge(Is)NotNull … where x.age not null Like findByFirstnameLike … where x.firstname like ?1 NotLike findByFirstnameNotLike … where x.firstname not like ?1 StartingWith findByFirstnameStartingWith … where x.firstname like ?1 (parameter bound with appended %) EndingWith findByFirstnameEndingWith … where x.firstname like ?1 (parameter bound with prepended %) Containing findByFirstnameContaining … where x.firstname like ?1 (parameter bound wrapped in %) OrderBy findByAgeOrderByLastnameDesc … where x.age = ?1 order by x.lastname desc Not findByLastnameNot … where x.lastname <> ?1 In findByAgeIn(Collection ages) … where x.age in ?1 NotIn findByAgeNotIn(Collection age) … where x.age not in ?1 TRUE findByActiveTrue() … where x.active = true FALSE findByActiveFalse() … where x.active = false IgnoreCase findByFirstnameIgnoreCase … where UPPER(x.firstame) = UPPER(?1)

下面介紹使用java原生的jpa操作數據庫,對jpa熟悉的朋友應該很快就能理解,springboot使用原生jpa的關鍵是引入entitymanger

看一下service層

package com.bus365.root.service.impl; import java.util.List; import javax.persistence.EntityManager;import javax.persistence.PersistenceContext; import org.springframework.stereotype.Service; import com.bus365.root.model.Address;import com.bus365.root.service.AddressService; @Servicepublic class AddressServiceImpl implements AddressService { @PersistenceContextprivate EntityManager entityManager;public List<Address> listAddress(){List resultList = entityManager.createNativeQuery('select * from address ', Address.class).getResultList();return resultList;}}

注意 @PersistenceContext

private EntityManager entityManager;

動態引入entitymanger , 之后就能正常使用了;

createNativeQuery是操作原生mysql方法;支持跨表查詢;

jpa的事務 直接使用注解Transactional 參數rollbackon表示回滾條件, 這個注解一搬加在service層; 注意getSingleResult 如果查不到數據會報錯;

@Transactional(rollbackOn= {Exception.class}) public Address getAddressByid(Long id) { Address singleResult = null; try { singleResult = (Address) entityManager .createNativeQuery('select * from address where id = :id', Address.class).setParameter('id', id) .getSingleResult(); } catch (Exception e) { e.printStackTrace(); } return singleResult; }

jpa實現多表聯查;

@Transactional public List<Object[]> getUserWithAddrByid(Long id) { List resultList = entityManager.createNativeQuery( 'select u.id id,u.age age,u.name name,a.name aname,a.completeaddress addre from user u left join address a on u.addressid = a.id where u.id = :id') .setParameter('id', id).getResultList(); return resultList; }

這是一個聯查user 和address的例子, 返回的結果是個List<Object[]> 項目中一般封裝成vo 類,或者List<Map<String,Object>> 的形式

github項目地址 https://github.com/Christain1993/SpringBootIntegration

補充:springBootJpa的復雜查詢

分頁

/** * 條件查詢+分頁 * @param whereMap * @param page * @param size * @return */ public Page<CaseManage> findSearch(Map whereMap, int page, int size,Integer createId) { Sort sort = new Sort(Sort.Direction.DESC,'id'); Specification<CaseManage> specification = createSpecification(whereMap,createId); PageRequest pageRequest = new PageRequest(page,size,sort); return caseDao.findAll(specification, pageRequest); } /** * 條件查詢 * @param whereMap * @return */ public List<CaseManage> findSearch(Map whereMap,Integer createId) { Specification<CaseManage> specification = createSpecification(whereMap, createId); return caseDao.findAll(specification); } /** * 動態條件構建 * @param searchMap * @return */ private Specification<CaseManage> createSpecification(Map searchMap,Integer createId) { return new Specification<CaseManage>() { @Override public Predicate toPredicate(Root<CaseManage> root, CriteriaQuery<?> query, CriteriaBuilder cb) {List<Predicate> predicateList = new ArrayList<Predicate>();// 案件名稱if (searchMap.get('case_name')!=null && !''.equals(searchMap.get('case_name'))) { predicateList.add(cb.like(root.get('case_name').as(String.class), '%'+(String)searchMap.get('case_name')+'%'));}// 案件編號uuid類型if (searchMap.get('case_uuid')!=null && !''.equals(searchMap.get('case_uuid'))) { predicateList.add(cb.equal(root.get('case_uuid').as(String.class), (String)searchMap.get('case_uuid')));}return cb.and( predicateList.toArray(new Predicate[predicateList.size()])); } }; }or查詢

想實現這樣的效果

where (state=1 or state=2)and name=’zhangsan’

java代碼

List<Predicate> predicateList = new ArrayList<Predicate>();Predicate or = cb.or(cb.and(cb.equal(root.get('case_authority').as(String.class), '0')), cb.and(cb.equal(root.get('create_id').as(String.class), String.valueOf(createId))));predicateList.add(or);

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持好吧啦網。如有錯誤或未考慮完全的地方,望不吝賜教。

標簽: Spring
相關文章:
主站蜘蛛池模板: 薪动-人力资源公司-灵活用工薪资代发-费用结算-残保金优化-北京秒付科技有限公司 | 太阳能发电系统-太阳能逆变器,控制器-河北沐天太阳能科技首页 | 地图标注|微信高德百度地图标注|地图标记-做地图[ZuoMap.com] | 深圳天际源广告-形象堆头,企业文化墙,喷绘,门头招牌设计制作专家 | 外观设计_设备外观设计_外观设计公司_产品外观设计_机械设备外观设计_东莞工业设计公司-意品深蓝 | 双工位钻铣攻牙机-转换工作台钻攻中心-钻铣攻牙机一体机-浙江利硕自动化设备有限公司 | 可程式恒温恒湿试验箱|恒温恒湿箱|恒温恒湿试验箱|恒温恒湿老化试验箱|高低温试验箱价格报价-广东德瑞检测设备有限公司 | 【黄页88网】-B2B电子商务平台,b2b平台免费发布信息网 | 浩方智通 - 防关联浏览器 - 跨境电商浏览器 - 云雀浏览器 | 科箭WMS仓库管理软件-TMS物流管理系统-科箭SaaS云服务 | 陶氏道康宁消泡剂_瓦克消泡剂_蓝星_海明斯德谦_广百进口消泡剂 | 苏州同创电子有限公司 - 四探针测试仪源头厂家 | 99文库_实习生实用的范文资料文库站 | 登车桥动力单元-非标液压泵站-非标液压系统-深圳市三好科技有限公司 | 沧州友城管业有限公司-内外涂塑钢管-大口径螺旋钢管-涂塑螺旋管-保温钢管生产厂家 | 深圳律师咨询_深圳律师事务所_华荣【免费在线法律咨询】网 | 不锈钢闸阀_球阀_蝶阀_止回阀_调节阀_截止阀-可拉伐阀门(上海)有限公司 | 不锈钢酒柜|恒温酒柜|酒柜定制|酒窖定制-上海啸瑞实业有限公司 | 北京开业庆典策划-年会活动策划公司-舞龙舞狮团大鼓表演-北京盛乾龙狮鼓乐礼仪庆典策划公司 | 定制/定做冲锋衣厂家/公司-订做/订制冲锋衣价格/费用-北京圣达信 | 玄米影院| 电缆隧道在线监测-智慧配电站房-升压站在线监测-江苏久创电气科技有限公司 | 破碎机_上海破碎机_破碎机设备_破碎机厂家-上海山卓重工机械有限公司 | 水冷式工业冷水机组_风冷式工业冷水机_水冷螺杆冷冻机组-深圳市普威机械设备有限公司 | 河南卓美创业科技有限公司-河南卓美防雷公司-防雷接地-防雷工程-重庆避雷针-避雷器-防雷检测-避雷带-避雷针-避雷塔、机房防雷、古建筑防雷等-山西防雷公司 | 蚂蚁分类信息系统 - PHP同城分类信息系统 - MayiCMS | 100国际学校招生 - 专业国际学校择校升学规划 | 珠海冷却塔降噪维修_冷却塔改造报价_凉水塔风机维修厂家- 广东康明节能空调有限公司 | 耳模扫描仪-定制耳机设计软件-DLP打印机-asiga打印机-fitshape「飞特西普」 | 北京百度网站优化|北京网站建设公司-百谷网络科技 | 湖南教师资格网-湖南教师资格证考试网 | 断桥铝破碎机_发动机破碎机_杂铝破碎机厂家价格-皓星机械 | 压滤机-洗沙泥浆处理-压泥机-山东创新华一环境工程有限公司 | 房屋质量检测-厂房抗震鉴定-玻璃幕墙检测-房屋安全鉴定机构 | 蒸压釜-陶粒板隔墙板蒸压釜-山东鑫泰鑫智能装备有限公司 | 北京网站建设公司_北京网站制作公司_北京网站设计公司-北京爱品特网站建站公司 | 志高装潢官网-苏州老房旧房装修改造-二手房装修翻新 | 自进式锚杆-自钻式中空注浆锚杆-洛阳恒诺锚固锚杆生产厂家 | 电动卫生级调节阀,电动防爆球阀,电动软密封蝶阀,气动高压球阀,气动对夹蝶阀,气动V型调节球阀-上海川沪阀门有限公司 | 六维力传感器_三维力传感器_二维力传感器-南京神源生智能科技有限公司 | 定制防伪标签_防伪标签印刷_防伪标签厂家-510品保防伪网 |