JPA Java Persistence API Query返回零结果

时间:2015-02-09 22:29:29

标签: java mysql jpa

我有四个实体:计划,事件,位置(对于此示例不重要)和EventLocation。 OneToOne映射是Schedule - >位置 - > EventLocation - >事件

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,它们是正确的。

我做错了什么以及如何解决?

3 个答案:

答案 0 :(得分:0)

我会尝试更详细的登录以查看正在执行的SQL语句。有关详细信息,请参阅http://wiki.eclipse.org/EclipseLink/Examples/JPA/Logging,&lt; property name =“eclipselink.logging.level.sql”value =“FINE”/&gt;可能是你需要的那个。 猜测'schedule.location.eventLocation.locationId'被翻译为所有映射表的内连接。确保所有连接表中都有正确的记录。

答案 1 :(得分:0)

我会直接查询数据库,看看各个表中存在哪些数据,你定义的很多关系都是可选的,你没有级联持久化,所以在代码中它可能看起来没问题,但是什么是写入数据库并不是所有记录都被写入。

我还假设&#34; locationId&#34;在Schedule实体上是一个错误。

答案 2 :(得分:0)

非常感谢医生

启用日志记录后,我注意到了这个问题。在位置,     @PrimaryKeyJoinColumn(name =&#34; locationId&#34;)

不正确。 JPA试图通过匹配Location.locationId和EventLocation.eventLocationId来加入EventLocation。据我了解,JPA不允许连接外键,因此无法完成。如果我想让它工作,数据库必须重组。