Spring Data JPA 查询返回重复行而不是实际数据,为什么?

Md.*_*man 1 java database spring hibernate spring-data-jpa

实体类

public class Event {

    @Id
    private String name;

    private String description;

    private Date eventDateTime;

    //getter and setter code
}
Run Code Online (Sandbox Code Playgroud)

服务等级

EventService {

  @Autowired EventRepository eventRepository;

  List<Event> getEvents () {
     List<Event> events = eventRepository.findAll();

     return events;
  }
}
Run Code Online (Sandbox Code Playgroud)

对于示例数据集: Event ('add', '', '2018-01-01 00:00:10') Event ('add', '', '2018-01-01 00:10:10') Event ('delete', '', '2018-01-01 00:20:00') 事件 ('edit', '', '2018-01-01 00:30:00')

JPA findAll() 查询返回重复行:

事件 ('add', '', '2018-01-01 00:00:10') 事件 ('add', '', '2018-01-01 00:00:10') 事件 ('add', '', '2018-01-01 00:00:10') 事件 ('添加', '', '2018-01-01 00:00:10')

Md.*_*man 7

为了避免重复(重复)数据,我们必须确保有一个唯一的键,并且会被@Id 注释。在这个例子中,name it self 不是唯一的,这就是结果显示重复数据的原因。eventDateTime作为唯一字段是更好的选择。

public class Event {

    private String name;

    private String description;

    @Id
    private Date eventDateTime;

    //getter and setter code
}
Run Code Online (Sandbox Code Playgroud)

或者,我们可以使用nameeventDateTime定义一个复合唯一键。

public class CompositeKey implements Serializable { 

    private String name;

    private Date eventDateTime;
}
Run Code Online (Sandbox Code Playgroud)

然后,使用 @IdClass(CopositeKey.class)注释Event类,使用 @Id注释nameeventDateTime字段

 @IdClass(CopositeKey.class)
 public class Event {
        @Id
        private String name;

        private String description;

        @Id
        private Date eventDateTime;

        //getter and setter code
    }
Run Code Online (Sandbox Code Playgroud)