我对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数据库中
答案 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上......
愚蠢的错误。