请求嵌入式ID

时间:2015-06-16 07:09:19

标签: java hibernate jpa

我对Hibernate有一些问题。

我有一个没有Id列的表。所以我使用嵌入式id将几列配置为Id。但是当我查询这两个ID中的一个时,我没有收到所有的值。

表格:

CODE_ACTION | CODE_AVANCEMENT | DATE_AVANCEMENT | COUT
----------------------------------------------------------
A0000001    | Engagée         | 09/09/11        | 2400
A0000002    | Terminée        | 05/10/12        | 2700
A0000002    | Engagée         | 05/10/12        | 2700
A0000003    | Terminée        | 06/06/10        | 0

我的实体

@Entity
@Component
@Data
@Table(name = "F_AVANCEMENT_ACTION")
public class AvancementActionDtw {

  // --------------------------------------------------------
  // FIELDS
  // --------------------------------------------------------  

  @Id
  private AvancementActionDtwPk id;

  @Temporal(TemporalType.TIMESTAMP)
  @Column(name = "DATE_AVANCEMENT", nullable = false)
  private Date dateAvancement;

  @Column(name = "COUT", nullable = true)
  private Integer coutAction;

}

我的嵌入式ID

@Data
@Embeddable
@EqualsAndHashCode(of = { "codeAction", "codeAvancement" })
public class AvancementActionDtwPk  implements Serializable {

  private static final long serialVersionUID = 1L;

  // --------------------------------------------------------
  // Fields
  // --------------------------------------------------------  

  @Column(name = "CODE_ACTION", nullable = false)
  private String codeAction;

  @Column(name = "CODE_AVANCEMENT", nullable = false)
  private String codeAvancement;

}

编辑:修改后的嵌入式ID

@Data
@Embeddable
// @EqualsAndHashCode(of = { "codeAction", "codeAvancement" })
public class AvancementActionDtwPk  implements Serializable {

  private static final long serialVersionUID = 1L;

  // --------------------------------------------------------
  // Fields
  // --------------------------------------------------------  

  @Column(name = "CODE_ACTION", nullable = false)
  private String codeAction;

  @Column(name = "CODE_AVANCEMENT", nullable = false)
  private String codeAvancement;

  // --------------------------------------------------------
  // Constructors
  // --------------------------------------------------------

  public AvancementActionDtwPk() {
  }

  public AvancementActionDtwPk(String codeAction, String codeAvancement) {
    this.codeAction = codeAction;
    this.codeAvancement = codeAvancement;
  }

  // --------------------------------------------------------
  // Equals and HashCode
  // --------------------------------------------------------

  @Override
  public int hashCode() {
    return new HashCodeBuilder(17, 31). // two randomly chosen prime numbers
        append(this.codeAction).append(this.codeAvancement).toHashCode();
  }

  @Override
  public boolean equals(Object obj) {
    if (!(obj instanceof AvancementActionDtwPk)) return false;
    if (obj == this) return true;

    AvancementActionDtwPk pk = (AvancementActionDtwPk) obj;
    return this.codeAction.equals(pk.codeAction) && this.codeAvancement.equals(pk.codeAvancement);
  }

}

DAO

@Repository
@Component
public interface AvancementActionDtwDao extends JpaRepository<AvancementActionDtw, AvancementActionDtwPk> {


  @Query("from AvancementActionDtw where id.codeAction = :codeAction and id.codeAvancement = :codeAvancement")
  List<AvancementActionDtw> findAvancementActionDtw(@Param("codeAction") String codeAction,
      @Param("codeAvancement") String codeAvancement);


  @Query("from AvancementActionDtw where id.codeAction = :codeAction")
  List<AvancementActionDtw> findAvancementActionDtw(@Param("codeAction") String codeAction);

}

如果我打电话

findAvancementActionDtw("A0000002")

我只得到第二个条目&lt;“A0000002”; “Engagée” &GT; 如果我明确设置第二个参数

findAvancementActionDtw("A0000002", "Terminée")

我没有结果

我想知道我哪里错了?

PS:数据在Oracle数据库中

2 个答案:

答案 0 :(得分:0)

从JPA 2.0规范,第11.1.15章EmbeddedId注释:

  

EmbeddedId注释应用于持久字段或   实体类或映射超类的属性,表示复合   主键是一个可嵌入的类。可嵌入的类必须是   注释为Embeddable。在一个中定义的关系映射   不支持嵌入式id类。

     

必须只有一个EmbeddedId注释且没有Id注释   使用EmbeddedId注释时。

我想您需要使用@EmbeddedId才能使其正常工作:

@Entity
@Component
@Data
@Table(name = "F_AVANCEMENT_ACTION")
public class AvancementActionDtw {
    @EmbeddedId
    private AvancementActionDtwPk id;
    ...
}

答案 1 :(得分:0)

实际上我的SQL Developer与我的应用程序不在同一个BDD上......

愚蠢的错误。