JPA:选择没有任何ID的行

时间:2016-05-24 09:38:06

标签: spring-boot spring-data-jpa

我有覆盖具有id的Oracle数据库表的实体。这很有效。

但是,还有另一个表基本上由外键EvId和其他列组成。没有列设置为NOT NULL,只有外键具有所有行的值:

CREATE TABLE PERSON (
  EVID      NUMBER,
  ROLE      VARCHAR2(128 BYTE),
  JOBID     NUMBER,
  NAME      VARCHAR2(128 BYTE))

如果我正确理解JPA,它总是需要一个id才能让事情顺利进行。此外,它要求所有id字段不能为空。像herehere这样的信息对我没有帮助。

Spring的存储库接口如下所示:

public interface PersonDao extends Repository<Person, Long> {

  public List<Person> findByEvidOrderByNameAsc(Long id);

}

现在,日志输出如下所示:

2016-05-24 11:17:32,107 DEBUG [org.hibernate.SQL] [main] select person0_.evid as evid1_2_, person0_.Name as Name3_2_, person0_.Role as Role5_2_, person0_.jobid as jobid6_2_ from Person person0_ where person0_.evid=? order by person0_.Name asc
2016-05-24 11:17:32,107 TRACE [org.hibernate.type.descriptor.sql.BasicBinder] [main] binding parameter [1] as [BIGINT] - [20507092]
2016-05-24 11:17:32,108 DEBUG [org.hibernate.loader.Loader] [main] Result set row: 0
2016-05-24 11:17:32,109 DEBUG [org.hibernate.loader.Loader] [main] Result row: null
2016-05-24 11:17:32,109 DEBUG [org.hibernate.loader.Loader] [main] Result set row: 1
2016-05-24 11:17:32,109 DEBUG [org.hibernate.loader.Loader] [main] Result row: null

Person的bean类必须是什么样的?

编辑:根据请求,这里是bean类(我不想添加它,因为它在所有测试后都是完全混乱)

@Entity
//@IdClass(Person.Key.class)
public class Person {

  //  @Embeddable
  //  public static class Key implements Serializable {
  //
  //    private static final long serialVersionUID = 1L;
  //
  //    public Key(Long evid, String role, Integer jobId, String name) {
  //      this.evid = evid;
  //      this.role = role;
  //      this.jobId = jobId;
  //      this.name = name;
  //    }
  //
  //    @Column(name = "evid", nullable = true, insertable = false, updatable = false)
  //    private Long evid;
  //
  //    @Column(name = "role", nullable = true, insertable = false, updatable = false)
  //    private String role;
  //
  //    @Column(name = "jobid", nullable = true, insertable = false, updatable = false)
  //    private Integer jobId;
  //
  //    @Column(name = "name", nullable = true, insertable = false, updatable = false)
  //    private String name;
  //
  //    @Override
  //    public int hashCode() {
  //      return Objects.hash(evid, role, jobId, name);
  //    }
  //
  //    @Override
  //    public boolean equals(Object obj) {
  //      return Objects.deepEquals(obj, this);
  //    }
  //
  //  }
  //
  //  @EmbeddedId
  //  private Key key;

  //  @Id
  @Column(name = "evid", nullable = true)
  private Long evid;

  //  @Id
  @Column(name = "role", nullable = true)
  private String role;

  //  @Id
  @Column(name = "jobid", nullable = true)
  private Integer jobId;

  //  @Id
  @Column(name = "name", nullable = true)
  private String name;

  @Id
  @Column(insertable = false, updatable = false)
  public String getRowId() {
    return "" + RandomUtils.nextInt(0, Integer.MAX_VALUE);
  }

  public void setRowId(String rowId) {
    System.out.println("rowid: " + rowId);
  }

  public Long getEvid() {
    return this.evid;
  }

  public void setEvid(Long evid) {
    this.evid = evid;
  }

  public String getRole() {
    return this.role;
  }

  public void setRole(String role) {
    this.role = role;
  }

  public Integer getJobId() {
    return this.jobId;
  }

  public void setJobId(Integer jobId) {
    this.jobId = jobId;
  }

  public String getName() {
    return this.name;
  }

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

  @Override
  public int hashCode() {
    return RandomUtils.nextInt(0, Integer.MAX_VALUE);
  }

//  @Override
//  public int hashCode() {
//    return Objects.hash(evid, role, jobId, name);
//  }

  @Override
  public boolean equals(Object obj) {
    return Objects.deepEquals(obj, this);
  }

  @Override
  public String toString() {
    return evid + ": " + name + " (" + Job.getById(jobId).getName() + "): " + role;
  }

}

0 个答案:

没有答案