2015-02-09 4 views
0

У меня есть четыре объекта: расписание, событие, местоположение (не важно для этого примера) и EventLocation. Отображения OneToOne являются Schedule -> Location -> EventLocation -> EventJPA Java Persistence API Query возвращает нулевые результаты

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) 

и я могу ходить по ссылкам. Например, идентификатор события правильно, когда я исполняю

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 для получения более подробной информации, < property name = "eclipselink.logging.level.sql" value = "FINE"/> может быть тот, который вам нужен. Угадайте, что 'schedule.location.eventLocation.locationId' переводится как внутренние объединения во все сопоставленные таблицы. Убедитесь, что у вас есть соответствующие записи во всех связанных таблицах.

0

Я бы запросил базу данных напрямую и посмотрел, какие данные существуют в разных таблицах, многие отношения, которые вы определили, являются необязательными, и вы не выполняете каскадный переход, поэтому возможно, что в коде он выглядит нормально, но что записывается в базу данных не все записи записываются.

Также я предполагаю, что «locationId» в объекте «Планирование» является ошибкой.

0

Огромное спасибо TheDoctor

После включения протоколирования, я заметил эту проблему. In Location, @PrimaryKeyJoinColumn (name = "locationId")

Был на вашем месте. JPA пыталась присоединиться к EventLocation, сопоставляя местоположение.locationId с EventLocation.eventLocationId. Насколько я понимаю, JPA не позволяет присоединяться к внешним ключам, поэтому это невозможно. База данных должна быть изменена, если я хочу, чтобы это работало.

Смежные вопросы