首页 > 解决方案 > 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);
}

这只是我的盲目射击,但我找不到任何材料来解释如何做这样的事情。
有人对如何解决此任务有任何建议吗?

标签: springjpaspring-data-jpaspring-datajpql

解决方案


您不会使用 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();
}

推荐阅读