问题:JPA 引入的 CriteriaUpdate 怎么用?
我的实体类
/**
* 文章 类
*
* @author LJM
*/
@Data
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "ARTICLE")
public class Article {
/**
* 文章 id
*/
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "article_id", nullable = false)
private Long articleId;
/**
* 文章 标题
*/
@Column(name = "article_title")
private String articleTitle;
/**
* 文章 内容
*/
@Column(name = "article_content")
private String articleContent;
/**
* 文章 类型
*/
@Column(name = "article_type")
private String articleType;
/**
* 文章 阅读量
*/
@Column(name = "article_read_number")
private Integer articleReadNumber;
/**
* 文章 点赞数
*/
@Column(name = "article_likes_number")
private Integer articleLikesNumber;
/**
* 多对一
* 多方
* 作者外键
* 维护方
*/
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "article_author_id")
private Author author;
public Article(Long articleId, String articleType) {
this.articleId = articleId;
this.articleType = articleType;
}
public Article(Long articleId, String articleContent, String articleType, Integer articleReadNumber) {
this.articleId = articleId;
this.articleContent = articleContent;
this.articleType = articleType;
this.articleReadNumber = articleReadNumber;
}
// public Article(Long articleId, String articleContent, String articleType, Integer articleReadNumber, Integer articleLikesNumber) {
// this.articleId = articleId;
// this.articleContent = articleContent;
// this.articleType = articleType;
// this.articleReadNumber = articleReadNumber;
// this.articleLikesNumber = articleLikesNumber;
// }
public Article(Long articleId, String articleTitle, String articleContent, String articleType, Integer articleReadNumber, Integer articleLikesNumber) {
this.articleId = articleId;
this.articleTitle = articleTitle;
this.articleContent = articleContent;
this.articleType = articleType;
this.articleReadNumber = articleReadNumber;
this.articleLikesNumber = articleLikesNumber;
}
public Article(Long articleId, String articleTitle, Author author) {
this.articleId = articleId;
this.articleTitle = articleTitle;
this.author = author;
}
public Article(Long articleId, String articleContent, String articleType, Integer articleReadNumber, Author author) {
this.articleId = articleId;
this.articleContent = articleContent;
this.articleType = articleType;
this.articleReadNumber = articleReadNumber;
this.author = author;
}
}
下面是我的代码
@SpringBootTest
public class text1 {
@Resource
private EntityManager entityManager;
@Test
public void aVoid10() {
// 获取 条件构造器
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
// 获取 更新条件 类
CriteriaUpdate criteriaUpdate = builder.createCriteriaUpdate(Article.class);
// 指定查询的实体类
// 即:UPDATE article
Root root = criteriaUpdate.from(Article.class);
// 开始构建更新语句
criteriaUpdate
// 添加更新内容 即:SET
.set(root.get("articleTitle"),"更新测试")
.set(root.get("articleContent"), "更新")
// 添加 条件 WHERE
.where(
builder.equal(root.get("articleId"), 9L)
);
// 创建 一个 Query的实例 用于执行 条件更新。
Query query = entityManager.createQuery(criteriaUpdate);
// int i = query.executeUpdate();
List articleList = query.getResultList();
// System.out.println(i <= 0 ? "失败!" : "成功!");
System.out.println("count = " + articleList.size());
System.out.println(articleList);
System.out.println("query = " + ResultVO.success(articleList));
}
}
使用 query.getResultList() 时,错误如下
java.lang.IllegalStateException: org.hibernate.hql.internal.QueryExecutionRequestException: Not supported for DML operations [update com.example.demo.entity.Article as generatedAlias0 set generatedAlias0.articleTitle = :param0, generatedAlias0.articleContent = :param1 where generatedAlias0.articleId=9L]
at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1620)
at org.hibernate.query.Query.getResultList(Query.java:165)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
使用 query.executeUpdate() 时,错误如下
javax.persistence.TransactionRequiredException: Executing an update/delete query
at org.hibernate.internal.AbstractSharedSessionContract.checkTransactionNeededForUpdateOperation(AbstractSharedSessionContract.java:445)
at org.hibernate.query.internal.AbstractProducedQuery.executeUpdate(AbstractProducedQuery.java:1692)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
我想要的结果
控制台输出:
Hibernate: UPDATE article SET article_title = ?, article_content = ? WHERE article_id = ?