史上最全之Spring Data詳細講解
阿新 • • 發佈:2019-01-26
萬物之源-> 官方文件
官網全是英文,一下是憑藉個人理解以及大量時間總結的筆記,供大家參考
// <!-- 簡單查詢語句 -->
// @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 + "]";
}
}