2015-02-09 75 views
0

我有四個實體:計劃,事件,位置(對本示例不重要)和EventLocation。該OneToOne映射是表 - >位置 - > EventLocation - >事件JPA Java持久性API查詢返回零結果

Schedule.java

@Entity 
@Table(name="Schedule") 
@NamedQuery(name="Schedule.findAll", query="SELECT s FROM Schedule s") 
public class Schedule implements Serializable { 
    @Id 
    private int scheduleId; 
    @Temporal(TemporalType.DATE) 
    private Date date; 
    private int locationId; 
    @OneToOne 
    @PrimaryKeyJoinColumn(name = "locationId") 
    private Location location; 
    ... 
} 

Event.java

@Entity 
@Table(name="Events") 
@NamedQuery(name="Event.findAll", query="SELECT e FROM Event e") 
public class Event implements Serializable { 
    @Id 
    private int eventId; 
    private String eventName; 
    ... 
} 

Location.java:

@Entity 
@Table(name="Locations") 
@NamedQuery(name="Location.findAll", query="SELECT l FROM Location l") 
public class Location implements Serializable { 
    @Id 
    private int locationId; 
    private String locationName; 
    @OneToOne 
    @PrimaryKeyJoinColumn(name = "locationId") 
    private EventLocation eventLocation; 
    ... 
} 

EventLocation .java

@Entity 
@Table(name="EventLocations") 
@NamedQuery(name="EventLocation.findAll", query="SELECT e FROM EventLocation e") 
public class EventLocation implements Serializable { 
    @Id 
    private int eventLocationId; 
    private int eventId; 
    private int locationid; 
    @OneToOne 
    @PrimaryKeyJoinColumn(name = "eventId") 
    private Event event; 
    ... 
} 

注意:我無法更改數據庫的佈局。

我執行查詢

SELECT schedule FROM Schedule schedule WHERE (schedule.location.eventLocation.eventLocationId<>0) 

,我可以通過引用行走。例如,事件ID是正確的,當我執行

System.out.println(curScheduleItem.getLocation().getEventLocation().getEvent().getEventId()) 

但是,如果我執行以下查詢,不返回任何結果,並且不產生錯誤。

SELECT schedule FROM Schedule schedule WHERE (schedule.location.eventLocation.eventId<>0) 

EVENTID是從來沒有零在數據庫中,有符合這個查詢,但JPA查詢將返回一個空的結果集的記錄。同樣的情況,如果我執行:

SELECT schedule FROM Schedule schedule WHERE (schedule.location.eventLocation.locationId<>0) 

它就像JPA不喜歡EVENTID或locationId,但eventLocationId 是罰款。而且,正如我所說的,如果我在沒有eventId或locationId的情況下執行查詢,請檢查結果中的eventId和locationId,它們是正確的。

我在做什麼錯,我該如何解決?

回答

0

我會嘗試打開一些更詳細的日誌記錄來查看正在執行的SQL語句。有關詳細信息,請參閱http://wiki.eclipse.org/EclipseLink/Examples/JPA/Logging,<屬性名稱=「eclipselink.logging.level.sql」value =「FINE」/ >可能是您需要的一個。 猜測'schedule.location.eventLocation.locationId'被翻譯爲所有映射表上的內部連接。確保你在所有連接的表格中都有正確的記錄。

0

我會直接查詢數據庫並查看各種表中存在的數據,您定義的很多關係是可選的,而且您不是級聯持久性的,所以有可能在代碼中它看起來不錯,寫入數據庫並不是所有記錄都正在寫入。

另外我假定Schedule實體上的「locationId」是一個錯誤。

0

巨大的感謝醫生

啓用日誌記錄後,我注意到了這個問題。在位置 @PrimaryKeyJoinColumn(name =「locationId」)

錯誤。 JPA試圖通過匹配位置來加入EventLocation。locationId與EventLocation.eventLocationId。這是我的理解,JPA不允許加入外鍵,所以這是不能做到的。如果我想要這個工作,數據庫必須重新構建。