在我的jpa存储库中,我可以查询在特定年份创建的记录: 如何在jpa规范中执行此操作?像这样的东西行不通: 这将引发以下异常: 我的课: createDate(create_date)列应该没有什么问题,因为我的repository.findByYearAndSort()可以很好地工作。 已解决: 谢谢大家。 @Query("select t from Ticket t where year(t.createDate) = ?1")
List<Ticket> findByYearAndSort(int year, Sort sort);
static Specification<Ticket> createdIn(int year) {
return (root, query, cb) -> cb.equal(root.get("year(createDate)"), year);
}
InvalidDataAccessApiUsageException: Unable to locate Attribute with
the the given name [year(createDate)] on this ManagedType
[onlineTicket.utility.domain.Ticket]; nested exception is
java.lang.IllegalArgumentException: Unable to locate Attribute with
the the given name [year(createDate)] on this ManagedType
[onlineTicket.utility.domain.Ticket]]
package onlineTicket.utility.domain;
import java.time.*;
import javax.persistence.*;
import javax.validation.constraints.*;
import org.springframework.data.annotation.*;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import org.springframework.format.annotation.DateTimeFormat;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
@Entity
@JsonIgnoreProperties(value = {"createTime", "updateTime"}, allowGetters = true)
@EntityListeners(AuditingEntityListener.class)
@Table(name="ticket", schema="utility")
@Access(AccessType.FIELD)
public class Ticket {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@NotBlank
@Size(min = 6, max = 6)
@Column(name = "number", unique = true)
private String number;
@NotNull
@DateTimeFormat(pattern = "yyyy-MM-dd")
@Column(name = "create_date")
private LocalDate createDate;
@Column(name = "user_group")
@Enumerated(EnumType.STRING)
private UserGroup group;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
@Column(name = "request_time")
private LocalDateTime requestTime;
@CreatedDate
@Column(name = "create_time")
private LocalDateTime createTime;
@LastModifiedDate
@Column(name = "update_time")
private LocalDateTime updateTime;
public Ticket(){}
Ticket(String number, LocalDate createDate) {
this.number = number;
this.createDate = createDate;
}
public final long getId() {
return id;
}
public final String getNumber() {
return number;
}
public final LocalDate getCreateDate() {
return createDate;
}
public final LocalDateTime getRequestTime() {
return requestTime;
}
}
根据建议的链接,我将功能更改为:return (root, query, builder) -> builder.equal(
builder.function("YEAR", Integer.class, root.get("createDate")), year);
0 个答案:
没有答案