He estado luchando con una consulta en hibernación para actualizar el estado de una entidad. Dicha entidad, llamada PaymentRequestLink, está en una relación de uno a muchos con otra entidad llamada 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;
}
Este es un ejemplo de datos de la tabla extraparameter_payment_link:
extraparameter_payment_link_id extra_type extra_value name
1 java.sql.Date 2019-01-01 EXPIRATION_DATE
La consulta Quiero hacer es actualizar el estado de la PaymentRequestLink a expirado cuando la fecha de caducidad, que se almacena en los ExtraParameters, es una fecha anterior a la fecha actual. Esta es la pregunta que tengo ahora:
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);
La excepción que tengo es:
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']
Puede alguien ayudarme con esto?
Elementos de colecciones indexadas (arrays, listas, y mapas) pueden ser referidos a por el índice en una cláusula donde sólo:
String stateSentence = "AND state <> '";
String sqlUpdateLinkDetailed = "UPDATE PaymentRequestLink ld SET state='EXPIRED' " +
"WHERE extraParameters['EXPIRATION_DATE'].value <= ? " +
stateSentence + PaymentRequestLinkState.PAID;
Ver la documentación HQL expresiones para más detalles.