【问题标题】:Spring Data JPA - JPQL query by given classSpring Data JPA - 给定类的 JPQL 查询
【发布时间】:2020-04-11 17:37:38
【问题描述】:


在我的大学课堂作业中,我有一个特定的练习要做。 给定这样的实体结构:

@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);
}

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

【问题讨论】:

    标签: spring jpa spring-data-jpa spring-data jpql


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2015-12-23
      • 1970-01-01
      • 2017-11-30
      • 2015-03-18
      • 1970-01-01
      • 2017-11-28
      • 2019-05-03
      • 2020-01-14
      • 1970-01-01
      相关资源
      最近更新 更多