一、JPA更新指定字段
JPA更新指定字段需要使用EntityManager的merge方法將實體對象與數據庫表進行同步。通過給實體對象的屬性賦值後進行merge操作將在數據庫表中更新對應的字段值,如下示例代碼所示:
public void updateFieldById(Long id, String fieldName, Object fieldValue) {
T entity = entityManager.find(clazz, id);
if (entity != null) {
try {
Field field = clazz.getDeclaredField(fieldName);
field.setAccessible(true);
field.set(entity, fieldValue);
entityManager.merge(entity);
} catch (NoSuchFieldException | IllegalAccessException e) {
e.printStackTrace();
}
}
}
二、JPA只查詢指定字段
在JPA中,只需要指定實體類中需要查詢的字段,就可以減少查詢的數據量,提高查詢效率。例如,使用@NamedQuery註解或者調用EntityManager的createNamedQuery方法來查詢指定字段,如示例代碼所示:
@NamedQuery(
name = "findUserNameById",
query = "SELECT u.username FROM User u WHERE u.id = :id"
)
public class User {
//...
}
public User findUserNameById(Long id) {
TypedQuery<String> query = entityManager.createNamedQuery("findUserNameById", String.class);
query.setParameter("id", id);
String username = query.getSingleResult();
return new User(username);
}
三、JPA查詢返回指定字段
JPA查詢返回指定字段需要自定義ResultClass,將查詢返回的結果映射到自己定義的ResultClass中。自定義ResultClass需要使用@ConstructorResult註解,將查詢返回的結果映射到實體類中的構造方法參數中,如下示例代碼所示:
@SqlResultSetMapping(name = "UserInfoMapping", classes = {
@ConstructorResult(targetClass = UserInfo.class, columns = {
@ColumnResult(name = "username", type = String.class),
@ColumnResult(name = "age", type = Integer.class),
@ColumnResult(name = "address", type = String.class)
})
})
public class User {
//...
}
public List<UserInfo> getUsersInfo() {
Query query = entityManager.createNativeQuery("SELECT username, age, address FROM users", "UserInfoMapping");
return query.getResultList();
}
public class UserInfo {
private String username;
private Integer age;
private String address;
public UserInfo(String username, Integer age, String address) {
this.username = username;
this.age = age;
this.address = address;
}
// getter and setter
}
四、JPA查詢指定排序字段
使用JPA查詢指定排序字段需要在查詢語句中添加order by子句,並在order by後指定排序字段,如下示例代碼所示:
public List<User> findAllUsersOrderByUsername() {
return entityManager.createQuery("SELECT u FROM User u ORDER BY u.username", User.class).getResultList();
}
五、JPA查詢某個字段
在JPA查詢某個字段時,可以直接在查詢語句中指定查詢的字段,並使用getSingleResult方法獲取結果集中的第一條記錄,如下示例代碼所示:
public String findUsernameById(Long id) {
return entityManager.createQuery("SELECT u.username FROM User u WHERE u.id = :id", String.class)
.setParameter("id", id)
.getSingleResult();
}
六、JPA查詢字段為null或為空
在JPA中查詢字段為null或為空需要使用IS NULL或IS EMPTY,如下示例代碼所示:
public List<User> findUsersWithNullAddress() {
return entityManager.createQuery("SELECT u FROM User u WHERE u.address IS NULL OR u.address = ''", User.class)
.getResultList();
}
七、JPA連表查詢展示多表字段選取
在JPA中進行連表查詢,可以使用JPQL語句實現。其中關聯字段通過JPA關係映射進行關聯,查詢結果需要自定義ResultClass來映射多表字段,如下示例代碼所示:
@Entity
public class User {
@Id
private Long id;
private String username;
private Integer age;
@OneToOne(mappedBy = "user")
private Address address;
// getter and setter
}
@Entity
public class Address {
@Id
private Long id;
private String province;
private String city;
private String area;
@OneToOne
private User user;
// getter and setter
}
@SqlResultSetMapping(name = "UserAndAddressMapping", classes = {
@ConstructorResult(targetClass = UserAndAddress.class, columns = {
@ColumnResult(name = "username", type = String.class),
@ColumnResult(name = "age", type = Integer.class),
@ColumnResult(name = "province", type = String.class),
@ColumnResult(name = "city", type = String.class),
@ColumnResult(name = "area", type = String.class)
})
})
public class UserAndAddress {
private String username;
private Integer age;
private String province;
private String city;
private String area;
public UserAndAddress(String username, Integer age, String province, String city, String area) {
this.username = username;
this.age = age;
this.province = province;
this.city = city;
this.area = area;
}
// getter and setter
}
public List<UserAndAddress> findUserAndAddress() {
Query query = entityManager.createQuery("SELECT new com.example.UserAndAddress(u.username, u.age, a.province, a.city, a.area) FROM User u JOIN u.address a", UserAndAddress.class);
return query.getResultList();
}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/183728.html