日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring Data JPA 从入门到精通~JpaSpecificationExecutor示例

發布時間:2024/7/23 javascript 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring Data JPA 从入门到精通~JpaSpecificationExecutor示例 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

新建兩個實體

@Entity(name = "UserInfoEntity") @Table(name = "user_info", schema = "test") public class UserInfoEntity implements Serializable {@Id@Column(name = "id", nullable = false)private Integer id;@Column(name = "first_name", nullable = true, length = 100)private String firstName;@Column(name = "last_name", nullable = true, length = 100)private String lastName;@Column(name = "telephone", nullable = true, length = 100)private String telephone;@Column(name = "create_time", nullable = true)private Date createTime;@Column(name = "version", nullable = true)private String version;@OneToOne(optional = false,fetch = FetchType.EAGER)@JoinColumn(referencedColumnName = "id",name = "address_id",nullable = false)@Fetch(FetchMode.JOIN)private UserReceivingAddressEntity addressEntity; ...... }@Entity @Table(name = "user_receiving_address", schema = "test") public class UserReceivingAddressEntity implements Serializable {@Id@Column(name = "id", nullable = false)private Integer id;@Column(name = "user_id", nullable = false)private Integer userId;@Column(name = "address_city", nullable = true, length = 500)private String addressCity; ...... }

UserRepository 需要繼承 JpaSpecificationExecutor

public interface UserRepository extends JpaSpecificationExecutor<UserInfoEntity> { }

調用者 UserInfoManager 的寫法

  • 我們演示一下直接用 lambda 使用 Root<T> 和 CriteriaBuilder 做一個簡單的不同條件的查詢和鏈表查詢。
@Component public class UserInfoManager {@Autowiredprivate UserRepository userRepository;public Page<UserInfoEntity> findByCondition(UserInfoRequest userParam,Pageable pageable){return userRepository.findAll((root, query, cb) -> {List<Predicate> predicates = new ArrayList<Predicate>();if (StringUtils.isNoneBlank(userParam.getFirstName())){//liked的查詢條件predicates.add(cb.like(root.get("firstName"),"%"+userParam.getFirstName()+"%"));}if (StringUtils.isNoneBlank(userParam.getTelephone())){//equal查詢條件predicates.add(cb.equal(root.get("telephone"),userParam.getTelephone()));}if (StringUtils.isNoneBlank(userParam.getVersion())){//greaterThan大于等于查詢條件predicates.add(cb.greaterThan(root.get("version"),userParam.getVersion()));}if (userParam.getBeginCreateTime()!=null&&userParam.getEndCreateTime()!=null){//根據時間區間去查詢 predicates.add(cb.between(root.get("createTime"),userParam.getBeginCreateTime(),userParam.getEndCreateTime()));}if (StringUtils.isNotBlank(userParam.getAddressCity())) {//聯表查詢,利用root的join方法,根據關聯關系表里面的字段進行查詢。predicates.add(cb.equal(root.join("addressEntityList").get("addressCity"), userParam.getAddressCity()));}return query.where(predicates.toArray(new Predicate[predicates.size()])).getRestriction();}, pageable);} } //可以仔細體會上面這個案例,實際工作中應該大部分都是這種寫法,就算擴展也是百變不離其中。
  • 我們再來看一個不常見的復雜查詢的寫法,來展示一下 CriteriaQuery 的用法(作者已經強烈不推薦了哦,和上面比起來太不優雅了)。
public List<MessageRequest> findByConditions(String name, Integer price, Integer stock) { messageRequestRepository.findAll((Specification<MessageRequest>) (itemRoot, query, criteriaBuilder) -> {//這里用 List 存放多種查詢條件,實現動態查詢List<Predicate> predicatesList = new ArrayList<>();//name 模糊查詢,like 語句if (name != null) {predicatesList.add(criteriaBuilder.and(criteriaBuilder.like(itemRoot.get("name"), "%" + name + "%")));}// itemPrice 小于等于 <= 語句if (price != null) {predicatesList.add(criteriaBuilder.and(criteriaBuilder.le(itemRoot.get("price"), price)));}//itemStock 大于等于 >= 語句if (stock != null) {predicatesList.add(criteriaBuilder.and(criteriaBuilder.ge(itemRoot.get("stock"), stock)));}//where() 拼接查詢條件query.where(predicatesList.toArray(new Predicate[predicatesList.size()]));//返回通過 CriteriaQuery 拼裝的 Predicatereturn query.getRestriction();});}
  • 而沒有 Spring Data JPA 封裝之前,如果想獲得此三個對象 Root<T> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder,老式 Hibernate 的寫法如下(PS:強烈不推薦哦,雖然現在也支持,只是讓大家知道了解一下。):
@Autowired //導入entityManagerprivate EntityManager entityManager; //創建CriteriaBuilder安全查詢工廠,CriteriaBuilder是一個工廠對象,安全查詢的開始.用于構建JPA安全查詢. CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); //創建CriteriaQuery安全查詢主語句 //CriteriaQuery對象必須在實體類型或嵌入式類型上的Criteria 查詢上起作用。 CriteriaQuery<Item> query = criteriaBuilder.createQuery(Item.class); //Root 定義查詢的From子句中能出現的類型 Root<Item> itemRoot = query.from(Item.class);
  • 我們再來看一個利用 CriteriaQuery 例子,其實大家可以擴展一下思路,就是 Hibernate 那套在這里面都支持,不過作者還是建議代碼越簡單越好。
List<UserSpuFavoriteEntity> result = userSpuFavoriteDao.findAll((Root<UserSpuFavoriteEntity> root, CriteriaQuery<?> query, CriteriaBuilder cb)->{query.where(cb.and(cb.equal(root.get("userName"), userName),cb.isFalse(root.get("isDelete"))));query.orderBy(cb.desc(root.get("updateTime")));return query.getRestriction();});

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的Spring Data JPA 从入门到精通~JpaSpecificationExecutor示例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。