Spring / JPA:复合键查找返回空元素[{}]

时间:2017-06-21 14:16:34

标签: spring postgresql hibernate jpa composite-key

我使用JPA构建我的数据模型,并使用Hibernate的EntityManager来访问数据。我正在将此配置用于其他类,并且没有任何问题。

问题是我创建了一个带有复合主键的实体(两个键是外键),添加元素完美无缺,我在数据库中检查了它,但是我无法从数据库中检索填充的行。

例如,如果我查询“FROM Referentiel”以返回表中所有引用的列表,我得到[{},{}]我的list.size()具有适当数量的元素(2),但元素是空的。

实体:

@Entity
@Table(name = "Et_referentiel")
public class Referentiel implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @Id
    @ManyToOne
    @JoinColumn(name = "id_projet")
    private Projet projet;

    @Id
    @ManyToOne
    @JoinColumn(name = "id_ressource")
    private Ressource ressource;


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

}

这是我的控制器getList方法:

@PostMapping(value = "/list", consumes = { MediaType.APPLICATION_JSON_UTF8_VALUE })
    public List<Referentiel> listReferentiel(@RequestBody Long idProjet) {

        List<Referentiel> referentiel = referentielService.listReferentiel(idProjet);
        return referentiel;
    }

这是我的道法:

@Autowired
    private EntityManager em;

    @Override
    public void ajouterReferentiel(Referentiel ref) {
        em.persist(ref);
        em.flush();

    }
    @SuppressWarnings("unchecked")
    @Override
    public List<Referentiel> listReferentiel(Long idProjet) {

        Query query = em.createQuery("Select r from Referentiel r where r.projet.idProjet=:arg1");
        query.setParameter("arg1", idProjet);
        em.flush();     
        List<Referentiel> resultList = query.getResultList();
        return resultList;
    }

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

尝试创建一个代表您的复合键的类:

public class ReferentielId implements Serializable {

    private static final long serialVersionUID = 0L;

    private Long projet; // Same type than idProjet, same name than inside Referentiel
    private Long ressource; // Same type than idRessource (I guess), same name than inside Referentiel

    // Constructors, getters, setters...
}

并将其分配给具有该复合密钥的实体。

@Entity
@IdClass(ReferentielId.class) // <- here
@Table(name = "Et_referentiel")
public class Referentiel implements Serializable {

    // ...
}

请注意,必须有一个表示复合键的类,即使这对您的问题没有帮助。