java - JPA Java 持久性 API 查询返回零结果

标签 java mysql jpa

我有四个实体:时间表、事件、位置(对于本示例而言并不重要)和事件位置。 OneToOne 映射是 Schedule -> Location -> EventLocation -> Event

时间表.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;
    ...
}

事件.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;
    ...
}

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

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

最佳答案

我会尝试打开一些更详细的日志记录来查看正在执行的 SQL 语句。请参阅http://wiki.eclipse.org/EclipseLink/Examples/JPA/Logging有关详细信息, 可能是您需要的。 猜测“schedule.location.eventLocation.locationId”被翻译为所有映射表上的内部联接。确保所有这些连接表中都有正确的记录。

关于java - JPA Java 持久性 API 查询返回零结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28420678/

相关文章:

java - 什么是NullPointerException,我该如何解决?

c++ - 如何使用 C++ 将 wxImage 存储到数据库中?

java - JPQL 查询不使用 "NOT IN"命令

java - 我可以在 Spring Roo 中使用 MS Access JDBC 驱动程序吗?

java - 正则表达式用于修复带有空格的断开链接

java - 如何在 Seam 2 中实现 resourcebundle (messages.properties) 的热重载

多个网络接口(interface)上的 Java Server

mysql - 发生未处理的低级错误

mysql - PHP MySQL 库与 MySQL 服务器不同

java - 使用 Hibernate-JPA 更新父子关系时出错