JpaRepository从postgre表中读取了很多行

时间:2017-12-28 11:26:28

标签: java spring

我有一个像这样的JpaRepository

public interface InfosRepository extends JpaRepository<Infos, String> {

}

和Infos类这样:

import javax.persistence.*;

@Entity
@Table(name = "infos")
@EntityListeners(Infos .class)
public class Infos {

    @Id
    @Column(name = "name")
    private String name;

    @Column(name = "age")
    private String age;

    public Infos() { }

    public Infos(String name) {
        this.name= name;
    }

    public Infos(String name, String age) {
        this.age = age;
        this.name= name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name= name;
    }

    public String getAge() { return age; }

    public void setAge(String age) { this.age= age;}

    @Override
    public boolean equals(Object other) {
        return (this == other) ||  this.name.equals( ((Infos) other).name  );
    }

    @Override
    public int hashCode() {
        return super.hashCode();
    }

}

所以这个类应该监听一个名为infos的postgre表,其中包含列名和年龄。该过程工作除了我没有检索到我在postgre中的所有值,并且有人重复。例如,我在postgre的信息表中有:

+-------+-----+
|   name|  age|
+-------+-----+
|charles|   20|
|charles|   32|
|charles|   55|
|    ted|   43|
| albert|   46|
|  clara|   23|
+-------+-----+

但在我的对象信息中,我看到了:

+-------+-----+
|   name|  age|
+-------+-----+
|charles|   55|
|charles|   55|
|charles|   55|
|    ted|   43|
| albert|   46|
|  clara|   23|
+-------+-----+

由于查尔斯在列id

,我松了20和30

我有这个类来实例化我的对象听postgre

@Service
public class ConsumerService {

   @Autowired
    private InfosRepository infosRepository ;

    @PostConstruct
    public void initializeConsumer() {
        InfosRepository infosRepositoryTest = infosRepository 
    }
}

当我在行

处放置一个断点时
InfosRepository infosRepositoryTest = infosRepository 
方法initializeConsumer()中的

我评估了infosRepository,它有错误的元素(丢失和重复)

你有什么想法吗?

1 个答案:

答案 0 :(得分:3)

ID应该唯一标识数据库中的行。所以,通过这种设计,你应该只有一个&#34;查尔斯&#34;在表中,name列应该是主键。

如果您需要多个查询,则需要添加包含唯一标识符的列,并将该列映射为实体的ID。

注意:Infos是这样一个实体的可怕名称。名称应描述实体代表的内容。它应该是单数,因为此类的实例表示一个行。例如,更好的名称是Person