5

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 フィールドを含めていませんが、含めても同じ結果が得られます。このクエリを実行するように説得するにはどうすればよいですか? クエリまたはエンティティを変更する必要がありますか?

4

0 に答える 0