gpt4 book ai didi

java - 具有映射属性的实体的 Hibernate 查询

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:00:43 24 4
gpt4 key购买 nike

我一直在努力处理 hibernate 中的查询以更新实体的状态。这种名为 PaymentRequestLink 的实体与另一个名为 extraparameters 的实体处于一对多关系

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

我得到的异常(exception)是:

 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']

谁能帮我解决这个问题?

最佳答案

Elements of indexed collections (arrays, lists, and maps) can be referred to by index in a where clause only:

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

参见 HQL expressions documentation了解详情。

关于java - 具有映射属性的实体的 Hibernate 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54260846/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com