Spring Data JPA - JPQL-запрос по заданному классу - PullRequest
0 голосов
/ 11 апреля 2020


У меня есть конкретное c упражнение, которое нужно выполнить в рамках домашней работы в университете. Данная структура сущностей выглядит следующим образом:

@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 {
...
}

Мне нужно реализовать метод JpaRepository в ParentRepository или, скорее, JPQL Query, чтобы выполнить операцию обновления таблицы, указанной параметром 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);
}

Это был только мой слепой выстрел, но я не мог найти никаких материалов, объясняющих, как делать такие вещи, как это.
У кого-нибудь есть предложения, как решить эту задачу?

1 Ответ

1 голос
/ 11 апреля 2020

Вы не будете делать это с 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();
}
...