Сравнение дат и максимум в JPA - PullRequest
0 голосов
/ 25 мая 2018

Я хочу задать два вопроса о 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);

1 Ответ

0 голосов
/ 25 мая 2018

Вы замените свой запрос, как показано ниже.

  @NamedQueries({
            @NamedQuery(name = "Auction.findById", query = "SELECT a FROM Auction a WHERE a.id = :id")
            @NamedQuery(name = "Auction.findExpired", query = "SELECT a FROM Auction a WHERE a.expireDate < :expireDate")

и установите параметр

 TypedQuery<Auction> auctionQuery = em.createNamedQuery("Auction.findExpired", Auction.class);
    auctionQuery.setParameter("expireDate", new Timestamp(System.currentTimeMillis()), TemporalType.TIMESTAMP);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...