繁体   English   中英

具有map属性的实体的Hibernate查询

[英]Hibernate query for entity with map property

我一直在努力解决hibernate中的查询来更新实体的状态。 这种名为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']

谁能帮我这个?

索引集合(数组,列表和映射)的元素只能通过where子句中的索引引用:

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

有关详细信息,请参阅HQL表达式文

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM