Java 使用任意字段(非主键)进行JPA连接

Java 使用任意字段(非主键)进行JPA连接,java,jakarta-ee,jpa,one-to-many,Java,Jakarta Ee,Jpa,One To Many,我有两个实体,我想用一个共同的字段连接在一起,这个字段叫做shared_id。这个字段不是这两个实体的主键。共享id是唯一的-每个Hipster都有一个唯一的共享id 这些表如下所示: Hipster Fixie ========= ======== id id shared_id shared_id 时髦人士和他们的追随者之间存在着一种单一的关系。我试过这样的方法: @Entity public class Hipster { @Id @Colum

我有两个实体,我想用一个共同的字段连接在一起,这个字段叫做shared_id。这个字段不是这两个实体的主键。共享id是唯一的-每个Hipster都有一个唯一的共享id

这些表如下所示:

Hipster    Fixie
=========  ========
id         id
shared_id  shared_id
时髦人士和他们的追随者之间存在着一种单一的关系。我试过这样的方法:

@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;
        }
    }
}

我认为这是令人不安的,因为sharedId字段用于关系,而不仅仅是一个基本字段。我没有在Fixie实体中包含sharedId字段,但是如果包含,我会得到相同的结果。我如何说服it为我运行此查询?我是否需要更改查询或实体?

只是想到了另一种表达方式。我有一个双向关系,但我想获取(并在查询中使用)用于定义该关系的列的值。我认为这与此相同。是的,同样的交易。可惜这不可能。在将来设计模式时,我肯定会记住这种情况,但在这个例子中,我没有选择。
java.lang.IllegalArgumentException: Can not set java.lang.Integer field Hipster.sharedId to java.lang.Integer