shared_id という共通のフィールドを使用して結合したい 2 つのエンティティがあります。フィールドはどちらのエンティティの主キーでもありません。shared_id は一意です - 各 Hipster は一意の shared_id を持ちます。
テーブルは次のようになります。
Hipster Fixie
========= ========
id id
shared_id shared_id
ヒップスターとフィクシーの間には OneToMany の関係があります。私はこのようなことを試しました:
@Entity
public class Hipster {
@Id
@Column(name = "id")
private Integer id;
@Column(name = "shared_id")
private Integer sharedId;
@OneToMany(mappedBy = "hipster")
private List<Fixie> fixies;
}
@Entity
public class Fixie {
@Id
@Column(name = "id")
private Integer id;
@ManyToOne
@JoinColumn(name = "shared_id", referencedColumnName = "shared_id")
private Hipster hipster;
}
@Repository
public class HipsterDAO {
@PersistenceContext
private EntityManager entityManager;
public Hipster getHipsterBySharedId(Integer sharedId) {
String queryString = "SELECT h FROM Hipster h WHERE h.sharedId = :sharedId";
TypedQuery<Hipster> query = entityManager.createQuery(queryString, Hipster.class);
query.setParameter("sharedId", sharedId);
try {
return query.getSingleResult();
} catch (PersistenceException e) {
return null;
}
}
}
今、私のDAOは私にこのエラーを与えます:
java.lang.IllegalArgumentException: Can not set java.lang.Integer field Hipster.sharedId to java.lang.Integer
sharedId フィールドが単なる基本フィールドではなく、リレーションで使用されているため、動揺していると思います。Fixie エンティティに sharedId フィールドを含めていませんが、含めても同じ結果が得られます。このクエリを実行するように説得するにはどうすればよいですか? クエリまたはエンティティを変更する必要がありますか?