1. 程式人生 > >史上最全之Spring Data詳細講解

史上最全之Spring Data詳細講解

萬物之源-> 官方文件

官網全是英文,一下是憑藉個人理解以及大量時間總結的筆記,供大家參考

//  <!--                簡單查詢語句                              -->
//          @Query 代表等價的 JPQL 語句      

    // @Query from User u where u.userId=:userId
    public List<User> findByUserId(String userId);
    // @Query from User u where u.userId=:userId and u.userName=:userName
public List<User> findByUserIdAndUserName(String userId,String userName); // @Query from User u where u.userId=:userId or u.userName=:userName public List<User> findByUserIdOrUserName(String userId,String userName); // @Query from User u where u.userName=:userName public
List<User> findByUserNameIs(String userName); // @Query from User u where u.userName=:userName public List<User> findByUserNameEquals(String userName); // @Query from User u where u.age between :begin and :end public List<User> findByAgeBetween(Integer begin,Integer end); // @Query from User u where u.age < :age
public List<User> findByAgeLessThan(Integer age); // @Query from User u where u.age <= :age public List<User> findByAgeLessThanEqual(Integer age); // @Query from User u where u.age > :age public List<User> findByAgeGreaterThan(Integer age); // @Query from User u where u.age >= :age public List<User> findByAgeGreaterThanEqual(Integer age); // @Query from User u where u.birthday > :date public List<User> findByBirthdayAfter(String date); // @Query from User u where u.birthday < :date public List<User> findByBirthdayBefore(String date); // @Query from User u where u.age is null public List<User> findByAgeIsNull(); // @Query from User u where u.password like :password // 注意 傳入password需要加%password% 否則 不是模糊查詢 public List<User> findByPasswordLike(String password); // @Query from User u where u.password not like :password public List<User> findByPasswordNotLike(String password); // @Query from User u where u.userName like %:userName public List<User> findByUserNameStartingWith(String userName); // @Query from User u where u.userName like %:userName% public List<User> findByUserNameContaining(String userName); // @Query from User u where u.userName like :userName% public List<User> findByUserNameEndingWith(String userName); // @Query from User u where u.userName = :userName order by u.age desc public List<User> findByUserNameOrderByAgeDesc(String userName); // @Query from User u where u.age <> :age public List<User> findByAgeNot(Integer age); // @Query from User u where u.userName in (userName.....) public List<User> findByUserNameIn(Collection<String> userNames); // @Query from User u where u.userName not in (userName.....) public List<User> findByUserNameNotIn(Collection<String> userNames); // @Query from User u where UPPER(u.userName) = UPPER(:userName) public List<User> findByUserNameIgnoreCase(String userName); // <!-- 刪除語句 注意 執行更新和儲存呼叫 save()方法 --> @Modifying @Transactional // @Query delete from User u where u.userName = :userName public long deleteByUserName(String userName);

一對一,一對多,多對多demo

package jpa.entity;

import java.util.Date;
import java.util.List;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;

import org.hibernate.annotations.GenericGenerator;

import com.fasterxml.jackson.annotation.JsonIgnore;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@NoArgsConstructor
@AllArgsConstructor
@Data
@Entity
@Table(name = "user")
public class User {
    @Id
    @GeneratedValue(generator = "system-uuid")
    @GenericGenerator(name = "system-uuid", strategy = "uuid")
    @Column
    private String userId;
    @Column
    private String userName;
    @Column
    private String password;
    @Column
    private Integer age;
    @Column
    private Date birthday;
    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinColumn(name = "information_id")
    private Information information;
    @JsonIgnore
//  CascadeType.PRESIST 級聯持久化(儲存)操作(持久儲存擁有方實體時,也會持久儲存該實體的所有相關資料。)
//  CascadeType.REMOVE 級聯刪除操作(刪除一個實體時,也會刪除該實體的所有相關資料。)
//  CascadeType.MERGE 級聯更新(合併)操作(將分離的實體重新合併到活動的永續性上下文時,也會合並該實體的所有相關資料。)
//  CascadeType.REFRESH 級聯重新整理操作 (只會查詢獲取操作)
//  CascadeType.ALL 包含以上全部級聯操作
    @OneToMany(mappedBy = "user", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    private List<Address> addresses ;
    @ManyToMany(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
    //@JoinTable描述了多對多關係的資料表關係。name屬性指定中間表名稱,joinColumns定義中間表與Teacher表的外來鍵關係。
    //中間表user_commodity的joinUserId列是Teacher表的主鍵列對應的外來鍵列,inverseJoinColumns屬性定義了中間表與另外一端的外來鍵關係。
    @JoinTable(name = "user_commodity",     
    joinColumns = { @JoinColumn(name = "joinUserId", referencedColumnName = "userId") }, 
    inverseJoinColumns = { @JoinColumn(name = "joinCommodityId", referencedColumnName = "commodityId") })
    private Set<Commodity> commodities;

    @Override
    public String toString() {
        return "User [userId=" + userId + ", userName=" + userName + ", password=" + password + ", age=" + age
                + ", birthday=" + birthday + ", information=" + information + ", addresses=" + addresses + "]";
    }
    public void addAddress(Address address){
        address.setUser(this);
        this.getAddresses().add(address);
    }
    public void addCommodity(Commodity commodity){
        this.commodities.add(commodity);
    }
}
package jpa.entity;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table;

import org.hibernate.annotations.GenericGenerator;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@NoArgsConstructor
@AllArgsConstructor
@Data
@Entity
@Table(name = "information")
public class Information {
    @Id
    @GeneratedValue(generator = "system-uuid")
    @GenericGenerator(name = "system-uuid", strategy = "uuid")
    @Column
    private String informationId;
    @Column
    private String phone;
    @Column
    private String idCard;
    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id")
    private User user;
    @Override
    public String toString() {
        return "Information [informationId=" + informationId + ", phone=" + phone + ", idCard=" + idCard + "]";
    }

}
package jpa.entity;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.Table;

import org.hibernate.annotations.GenericGenerator;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@NoArgsConstructor
@AllArgsConstructor
@Data
@Entity
@Table(name = "commodity")
public class Commodity {

    @Id
    @GeneratedValue(generator = "system-uuid")
    @GenericGenerator(name = "system-uuid", strategy = "uuid")
    @Column
    private String commodityId;
    @Column
    private Double price;
    @ManyToMany(mappedBy = "commodities")
    private List<User> users = new ArrayList<User>();

    public void addUser(User user){
        this.users.add(user);
    }

}
package jpa.entity;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

import org.hibernate.annotations.GenericGenerator;

import com.fasterxml.jackson.annotation.JsonIgnore;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@NoArgsConstructor
@AllArgsConstructor
@Data
@Entity
@Table(name = "address")
public class Address {
    @Id
    @GeneratedValue(generator = "system-uuid")
    @GenericGenerator(name = "system-uuid", strategy = "uuid")
    @Column
    private String addressId;
    @Column
    private String province;
    @Column
    private String city;
    @Column
    private String detailedInformation;
    /*
     * optional屬性的預設值是true
     * optional=false 時join 查詢關係為inner join
     * optional=true 時join 查詢關係為left join
     */
    @JsonIgnore
    @ManyToOne(fetch = FetchType.EAGER ,cascade=CascadeType.ALL ,optional=false)
    @JoinColumn(name = "user_id")
    private User user;
    @Override
    public String toString() {
        return "Address [addressId=" + addressId + ", province=" + province + ", city=" + city
                + ", detailedInformation=" + detailedInformation + "]";
    }


}