spring - Spring Data JPA - 给定类的 JPQL 查询
问题描述
在我的大学课堂作业中,我有一个特定的练习要做。给定这样的实体结构:
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Parent {
...some fields...
}
@Entity
public class ChildA extends Parent {
...
}
@Entity
public class ChildB extends Parent {
...
}
我必须在 ParentRepository 或 JPQL Query 中实现 JpaRepository 方法才能对Class<? extends Parent>
参数指定的表执行更新操作。简单地说,方法应该更新一些字段,但只能在作为参数给出的子类中。
方法结构应该是:
public interface ParentRepository extends JpaRepository<Parent, Integer> {
void updateInBulk(Class<? extends Parent> clazz, int someParameter);
}
我想出了这样的东西,但它没有用。
public interface ParentRepository extends JpaRepository<Parent, Integer> {
@Modifying
@Query("update :entity e set e.some_field = 'T' where e.other_field > :some_param")
void updateInBulk(@Param("entity") Class<? extends Parent> clazz, @Param("some_param") int someParam);
}
这只是我的盲目射击,但我找不到任何材料来解释如何做这样的事情。
有人对如何解决此任务有任何建议吗?
解决方案
您不会使用 JPQL 执行此操作,但您更愿意为此编写一个Criteria query
- 您也可以将其添加到您的 JPARepository 中。类似的东西(您需要根据自己的需要进行调整。)
public void updateInBulk(Class<? extends Parent> clazz, String someParameterName , int someValue) {
CriteriaBuilder cb = this.em.getCriteriaBuilder();
// create update
CriteriaUpdate<Order> update = cb.createCriteriaUpdate(clazz);
// set the root class
Root e = update.from(clazz);
// set update and where clause
update.set(someParameterName, someValue);
// update.where(cb.greaterThanOrEqualTo(e.get(someParameterName), oldValue));
// perform update
this.em.createQuery(update).executeUpdate();
}
推荐阅读
- javascript - 如何更改特定媒体查询的 CSS 类属性值?
- kdb - 我可以创建一个值为列表的字典吗
- git - Azure devops 错误:Git 签出失败,退出代码:1
- python - 如何用另一个数据框的对应值替换多列中的特定值?
- regex - 提取两个下划线之间的文本
- c++ - C++:为什么这段代码只在使用'\n'时才有效?
- sql-server - 在 SQL Server 查询中获取每月数据
- apache-poi - POI读取excel单元类型错误没有这样的属性:类的单元类型
- javascript - 如何在 CSS 中动态更改动画名称
- javascript - 在组件外部的 react-router v5 中以编程方式访问历史记录(history.push 等)