[JEE] JPA, problem z DATE

0

Witam

jak poprzednio pisałem, tworzę aplikacje w Netbeans 6.9 przy użyciu JSF 2.0(Mojarra), EJB i JPA(EclipseLink) przy użyciu serwera GlassFish oraz na bazie PostgreSQL(8.4.3).

Mam sobie taką encje:

@Entity
@Table(name = "connections")
@NamedQueries({
    @NamedQuery(name = "Connection.findAll", query = "SELECT c FROM Connection c"),
    @NamedQuery(name = "Connection.findById", query = "SELECT c FROM Connection c WHERE c.id = :id"),
    @NamedQuery(name = "Connection.findBySource", query = "SELECT c FROM Connection c WHERE c.source = :source"),
    @NamedQuery(name = "Connection.findByDestination", query = "SELECT c FROM Connection c WHERE c.destination = :destination"),
    @NamedQuery(name = "Connection.findByCalendarDate", query = "SELECT c FROM Connection c WHERE c.calendarDate = :calendarDate"),
    @NamedQuery(name = "Connection.findByType", query = "SELECT c FROM Connection c WHERE c.type = :type"),
    @NamedQuery(name = "Connection.findByIsActive", query = "SELECT c FROM Connection c WHERE c.isActive = :isActive"),
    @NamedQuery(name = "Connection.findBySourceDestination", query = "SELECT c FROM Connection c WHERE c.destination = :destination AND c.source = :source"),
    @NamedQuery(name = "Connection.findBySourceDestinationCalendarDate", query = "SELECT c FROM Connection c WHERE c.source = :source AND c.destination = :destination AND c.calendarDate = :calendarDate")})
public class Connection implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @Column(name = "id")
    private Integer id;
    @Column(name = "source")
    private String source;
    @Column(name = "destination")
    private String destination;
    @Column(name = "calendar_date")
    @Temporal(TemporalType.DATE)
    private Date calendarDate;
    @Column(name = "type")
    private String type;
    @Column(name = "is_active")
    private String isActive;
    @OneToMany(mappedBy = "connection")
    private List<CustomerChoice> customerChoiceList;
    @JoinColumn(name = "id_personnel", referencedColumnName = "id")
    @ManyToOne
    private StaffInfo staffInfo;
    @OneToMany(mappedBy = "connection")
    private List<PriceList> priceListList;
//////////////////////////////////////////////////////// dalej są gettery i settery plus te metody
    @Override
    public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Connection)) {
            return false;
        }
        Connection other = (Connection) object;
        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "kkp.model.Connection[id=" + id + "]";
    }

}

Mam sobie beana @stateless ConnectionFacade
a w nim metode:

        public List<Connection> getPossibleFlights(String source, String destination, Date calendarDate) {
        Query q = em.createNamedQuery("Connection.findBySourceDestinationCalendarDate");
        //Query q = em.createNamedQuery("Connection.findBySourceDestination");
        q.setParameter("source",source);
        q.setParameter("destination",destination);
        q.setParameter("calendarDate",calendarDate);
        List<Connection> u = q.getResultList();
        return u;
    }

W ManagedBeanie mam cos takiego:

    public List<Connection> getPossibleConnections() {
        String source = this.findCityName(this.sourceCityString);
        String destination = this.findCityName(this.destinationCityString);
        // tutaj jest taki dziwny format daty ze trzeba odjac 1900, zrodlo javadoc
        int yearD = Integer.parseInt(year) - 1900;
        Date calendarDate = new Date(yearD, Integer.parseInt(month), Integer.parseInt(day));
        return connectionFacade.getPossibleFlights(source, destination, calendarDate);
    }

W zależności od tego czy odejmiemy 1900 od roku czy nie odejmę to i tak nie zwraca żadnych wyników.
http://i.imgur.com/B9p1a.jpg

Natomiast jak sobie zakomentuje date i zastosuje
@NamedQuery(name = "Connection.findBySourceDestination", query = "SELECT c FROM Connection c WHERE c.destination = :destination AND c.source = :source")

To wszystko jest ok i zwraca poprawny wynik:
http://i.imgur.com/JAb9A.jpg

Próbowałem także na "sztywno" wstawić wartości np

int year=2010;
int month=1;
int day=1;
Date calendarDate = new Date(year, month, day);

albo
Date calendarDate = new Date(year-1900, month, day);

Ale nadal bez skutku.
Jakieś pomysły?

PS jeśli chodzi o datę to korzystam z
import java.util.Date;

0
  1. miesiąc jest liczony od 0 więc np grudzień to 11 nie 12.

  2. może być tak że masz inną strefe czasową na bazie a w innej ta data jest wysyłana.. co się wtedy dzieje -nie wiadomo. Czasem potrafi odjąc np godzinę co z 2010-08-12 00:00 robi już 2010-08-11 23:00

nie szukal bym problemu w kodem zwiazanym czysto z jpa, raczej z tą datą jest coś nie tak

0
Freakman napisał(a)
  1. miesiąc jest liczony od 0 więc np grudzień to 11 nie 12.

Po uwzględnieniu tego faktu, działa. :D
Dziękuje.

BTW strasznie dziwnie ta data jest zaimplementowana, miesiące idą od 0(jak by im było żal pamięci :-P ), od roku odejmujesz 1900 a dni standardowo. Jak by nie można było podawać zwykły format czyli np 10-1-2005. A później ludzie wypisują długie posty na forum bo dokumentacje za szybko przeczytali. ;-P

Jeszcze się spytam tak z ciekawości czy można w JPA w encjach stosować klasę GregorianCalendar zamiast Date.

0

fakt zdarzają się takie osoby ; )

z typow 'czasowych' wedlug ksiazki tylko:
1.java.util.Date
2.java.util.calendar (wiec gregorian tez)
3. java.sql.Timestamp
4. java.sql.Date
5. java.sql.Time

1 użytkowników online, w tym zalogowanych: 0, gości: 1