Я хочу задать два вопроса о JPA: что неправильно в моем запросе (Offer.findHighestOffer), который должен выбирать максимальную цену из каждого предложения, связанного с аукционом, правильно ли он написан?
@Entity
@NamedQuery(name = "Offer.findAll", query = "SELECT o FROM Offer o")
@NamedQueries({
@NamedQuery(name = "Offer.findById", query = "SELECT o FROM Offer o WHERE o.id = ?1"),
@NamedQuery(name = "Offer.findHighestOffer", query = "SELECT o FROM Offer o WHERE o.auction.id = ?1 HAVING MAX(o.price)")
})
public class Offer implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private double price;
@ManyToOne
private Auction auction;
@ManyToOne
private UserAccount user;
private Timestamp creationDate = new Timestamp(System.currentTimeMillis());
а может кто-нибудь сказать мне, как сравнивать поля меток времени в jpql?
Вот моя сущность аукциона
@Entity
@NamedQueries({
@NamedQuery(name = "Auction.findById", query = "SELECT a FROM Auction a WHERE a.id = ?1"),
@NamedQuery(name = "Auction.findAll", query = "SELECT a FROM Auction a"),
@NamedQuery(name = "Auction.findExpired", query = "SELECT a FROM Auction a WHERE a.expireDate < ?1"),
})
public class Auction implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@ManyToOne
private UserAccount user; //nie daje sie id tylko obiekt
private String description;
private String title;
private double price;
@OneToMany(mappedBy = "auction", orphanRemoval = true, cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private List<Offer> offers = new LinkedList<Offer>();
private Timestamp creationDate = new Timestamp(System.currentTimeMillis());
private Timestamp expirationDate;
Я прочитал кое-что о передаче текущего времени в качестве параметра, и я сделал это, ноон по-прежнему вылетает
Problem compiling [SELECT a FROM Auction a WHERE a.expireDate < ?1].
[30, 42] The state field path 'a.expireDate' cannot be resolved to a valid type.
и в моем коде он используется так:
Offer highestOffer;
TypedQuery<Auction> auctionQuery = em.createNamedQuery("Auction.findExpired", Auction.class);
auctionQuery.setParameter(1, new Timestamp(System.currentTimeMillis()), TemporalType.TIMESTAMP);