Запрос гибернации для объекта со свойством карты - PullRequest
0 голосов
/ 18 января 2019

Я боролся с запросом в спящем режиме, чтобы обновить состояние объекта. Такой объект, называемый PaymentRequestLink, находится в отношении один ко многим с другим объектом, называемым экстрапараметрами

PaymentRequestType.java:

@Entity
@Table(name="payment_link")
public class PaymentRequestLink {

     private Map<String, ExtraParameter<E>> extraParameters;

     @Fetch(FetchMode.SELECT)
     @ElementCollection(fetch=FetchType.EAGER)
     @CollectionTable(name="extraparameter_payment_link", 
       schema=BaseEntity.DATABASE_SCHEMA, joinColumns=@JoinColumn(name="extraparameter_payment_link_id"))
     @MapKeyColumn(name = "name", length=64, nullable = false)
     public Map<String, ExtraParameter<String>> getExtraParameters() {
           return extraParameters;
      }

ExtraParameter.java:

 @Embeddable
 public class ExtraParameter<T extends Serializable> implements Serializable {

     //...

     @Column(name="extra_type", length=64, nullable=false)
     @NotNull
     public String getType() {
         return type;
     }

     @Column(name="extra_value", length=255, nullable=false)
     @NotNull
     public T getValue() {
         return value;
     }

Это пример данных таблицы extraparameter_payment_link:

extraparameter_payment_link_id  extra_type           extra_value          name
    1                           java.sql.Date        2019-01-01           EXPIRATION_DATE

Запрос, который я хочу сделать, состоит в том, чтобы обновить состояние PaymentRequestLink до EXPIRED, когда дата окончания срока действия, которая хранится в дополнительных параметрах, является датой, предшествующей текущей дате. Это запрос, который я сейчас имею:

    String stateSentence = "AND state <> '";
    String sqlUpdateLinkDetailed =  "UPDATE PaymentRequestLink ld SET state='EXPIRED' " +
            "WHERE extraParameters.EXPIRATION_DATE.value <= ? " +
            stateSentence + PaymentRequestLinkState.PAID;

    Calendar calendar = Calendar.getInstance();
    calendar.add(Calendar.MINUTE, 1);
    Timestamp now = new Timestamp(calendar.getTimeInMillis());

    hibernateTemplate.bulkUpdate(sqlUpdateLinkDetailed, now);

Исключение, которое у меня есть:

 error processing job
 org.springframework.orm.hibernate3.HibernateQueryException: could not resolve property: EXPIRATION_DATE of: component[type,value] [UPDATE 
 com.some.company.PaymentRequestLink ld SET state='EXPIRED' WHERE extraParameters.EXPIRATION_DATE.value <= ? AND state <> 'PAID']; nested exception is org.hibernate.QueryException: could not resolve property: EXPIRATION_DATE of: component[type,value] [UPDATE com.some.company.PaymentRequestLink ld SET state='EXPIRED' WHERE extraParameters.EXPIRATION_DATE.value <= ? AND state <> 'PAID']

Может кто-нибудь помочь мне с этим?

1 Ответ

0 голосов
/ 21 января 2019

Элементы индексированных коллекций (массивы, списки и карты) могут быть указывается индексом только в предложении where:

String stateSentence = "AND state <> '";
String sqlUpdateLinkDetailed =  "UPDATE PaymentRequestLink ld SET state='EXPIRED' " +
            "WHERE extraParameters['EXPIRATION_DATE'].value <= ? " +
            stateSentence + PaymentRequestLinkState.PAID;

Подробнее см. Документация по выражениям HQL .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...