Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate中的映射问题 我正在开发一个JPASTSTER项目,由于我认为的映射问题,我已经停止了。_Java_Hibernate_Jpa_Mapping_Jhipster - Fatal编程技术网

Java Hibernate中的映射问题 我正在开发一个JPASTSTER项目,由于我认为的映射问题,我已经停止了。

Java Hibernate中的映射问题 我正在开发一个JPASTSTER项目,由于我认为的映射问题,我已经停止了。,java,hibernate,jpa,mapping,jhipster,Java,Hibernate,Jpa,Mapping,Jhipster,我的数据库有几个表,但这里影响我的两个表是研究和出版,它们之间有多对多的关系 我需要检索可以发布研究的出版物集合,因此研究是关系的所有者,但由于某些原因,Hibernate无法识别我映射关系的属性 所有这一切都开始试图解决一个懒惰的连接问题,是的,我已经通过了大多数与此相关的帖子,我已经尝试了所有对我有意义的事情 以下是学习守则: @Audited @Entity @Table(name = "Study") @Cache(usage = CacheConcurrencyStrategy.NON

我的数据库有几个表,但这里影响我的两个表是研究和出版,它们之间有多对多的关系

我需要检索可以发布研究的出版物集合,因此研究是关系的所有者,但由于某些原因,Hibernate无法识别我映射关系的属性

所有这一切都开始试图解决一个懒惰的连接问题,是的,我已经通过了大多数与此相关的帖子,我已经尝试了所有对我有意义的事情

以下是学习守则:

@Audited
@Entity
@Table(name = "Study")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@Document(indexName = "study")
public class Study implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(name = "num_sites")
    private Integer numSites;

    @Column(name = "ref")
    private String ref;

    @Column(name = "study_type")
    private String studyType;

    @ManyToMany(fetch = FetchType.LAZY)
    @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
    @JoinTable(name = "Pub_Study",
               joinColumns = @JoinColumn(name="studies_id", referencedColumnName="id"),
               inverseJoinColumns = @JoinColumn(name="publications_id", referencedColumnName="id"))
    public static Set<Publication> publications = new HashSet<>();

    @OneToMany(mappedBy = "study")
    @JsonIgnore
    @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
    private Set<SiteData> siteDatas = new HashSet<>();

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Integer getNumSites() {
        return numSites;
    }

    public void setNumSites(Integer numSites) {
        this.numSites = numSites;
    }

    public String getRef() {
        return ref;
    }

    public void setRef(String ref) {
        this.ref = ref;
    }

    public String getStudyType() {
        return studyType;
    }

    public void setStudyType(String studyType) {
        this.studyType = studyType;
    }

    public static Set<Publication> getPublicationss() {
        return publications;
    }

    public void setPublicationss(Set<Publication> publications) {
        this.publications = publications;
    }

    public Set<SiteData> getSiteDatas() {
        return siteDatas;
    }

    public void setSiteDatas(Set<SiteData> siteDatas) {
        this.siteDatas = siteDatas;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        Study study = (Study) o;
        if(study.id == null || id == null) {
            return false;
        }
        return Objects.equals(id, study.id);
    }

    @Override
    public int hashCode() {
        return Objects.hashCode(id);
    }

    @Override
    public String toString() {
        return "Study{" +
            "id=" + id +
            ", numSites='" + numSites + "'" +
            ", ref='" + ref + "'" +
            ", studyType='" + studyType + "'" +
            '}';
    }

实体定义中有一个输入错误:“publicationss”而不是“publications”。由于Hibernate使用JavaBeans属性进行数据访问,它会抱怨定义中的getPublications()丢失


元模型保留了这些类型,考虑使用它。

因为您正在使用标准API,考虑使用它的元模型而不是普通字符串来查询属性。Criteria API在没有元模型的情况下几乎没有意义,可以用JPQL替换,没有任何损失。您好,谢谢您的回复,我终于能够找出问题所在,它给了我惰性的序列化,因为我在查询中没有获取,我需要的只是:siteData.fetch(“研究”).fetch(“出版物”);在QueBu建建器的末尾,GETPuxIdSSS是当我创建实体时它是如何出现的,不要问我为什么?顺便说一下,我将考虑从现在起使用元模型;
@Audited
@Entity
@Table(name = "Publication")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@Document(indexName = "publication")
public class Publication implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(name = "authors")
    private String authors;

    @Column(name = "first_author")
    private String firstAuthor;

    @Column(name = "journal")
    private String journal;

    @Column(name = "pubMedId")
    private Integer pubMedId;

    @Column(name = "title")
    private String title;

    @Column(name = "year_publish")
    private Integer yearPublish;

    @Version
    Integer version;

    @ManyToMany(fetch = FetchType.LAZY)
    @JsonIgnore
    @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
    private Set<Study> studies = new HashSet<>();

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getAuthors() {
        return authors;
    }

    public void setAuthors(String authors) {
        this.authors = authors;
    }

    public String getFirstAuthor() {
        return firstAuthor;
    }

    public void setFirstAuthor(String firstAuthor) {
        this.firstAuthor = firstAuthor;
    }

    public String getJournal() {
        return journal;
    }

    public void setJournal(String journal) {
        this.journal = journal;
    }

    public Integer getPubMedId() {
        return pubMedId;
    }

    public void setPubMedId(Integer pubMedId) {
        this.pubMedId = pubMedId;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public Integer getYearPublish() {
        return yearPublish;
    }

    public void setYearPublish(Integer yearPublish) {
        this.yearPublish = yearPublish;
    }

    public Set<Study> getStudies() {
        return studies;
    }

    public void setStudies(Set<Study> studys) {
        this.studies = studys;
    }

    public Integer getVersion(){
        return version;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        Publication publication = (Publication) o;
        if(publication.id == null || id == null) {
            return false;
        }
        return Objects.equals(id, publication.id);
    }

    @Override
    public int hashCode() {
        return Objects.hashCode(id);
    }

    @Override
    public String toString() {
        return "Publication{" +
            "id=" + id +
            ", authors='" + authors + "'" +
            ", firstAuthor='" + firstAuthor + "'" +
            ", journal='" + journal + "'" +
            ", pubMedId='" + pubMedId + "'" +
            ", title='" + title + "'" +
            ", yearPublish='" + yearPublish + "'" +
            '}';
    }
}
public class SiteDataRepositoryImpl implements SiteDataRepositoryCustom{

    @PersistenceContext
    private EntityManager em;

    @Override
    public List <SiteDataViewDTO> searchSiteDataByFilter(List<Filter> listFilters) {
        TypedQuery<SiteData> query = buildQuery(listFilters);
        Hibernate.initialize(Study.publications);
        int count=0;
        for (Filter filter: listFilters){
            if("country".equals(filter.getName()))
                query.setParameter(filter.getName(), filter.getQuery());
            else if("category".equals(filter.getName()))
                query.setParameter(filter.getName(), filter.getQuery());
            else if("studyRef".equals(filter.getName()))
                query.setParameter(filter.getName(), filter.getQuery());
            else if("studyType".equals(filter.getName()))
                query.setParameter(filter.getName(), filter.getQuery());
            else if("pubMedId".equals(filter.getName()))
                query.setParameter(filter.getName(), Integer.valueOf(filter.getQuery()));
            count++;
        }

        List<SiteData> siteDataList = query.getResultList();

        List<SiteDataViewDTO> siteDataViewDTOList=new ArrayList<SiteDataViewDTO>();

        //temp variables
        List<String>tempListTreatments = new ArrayList<String>();
        List<String>tempListTitles = new ArrayList<String>();
        List<Integer>tempListIdMed = new ArrayList<Integer>();

        //filling SiteDataViewDTO list
        siteDataList.stream().forEach(sd->{
             SiteDataViewDTO temp = new SiteDataViewDTO();
             temp.setTypeStudy(sd.getTypeStudy() + "id SiteData: " + sd.getId());
             temp.setRef(sd.getStudy().getRef());
             temp.setCategory(sd.getCategory().getName());
             temp.setUpper95CI(sd.getUpper95CI());
             temp.setYearStart(sd.getYearStart());
             temp.setYearEnd(sd.getYearEnd());
             Set<Publication>setPu = sd.getStudy().getPublicationss();
             System.out.println("@@@@@@@@@@@@@@@@@@@@ In the query, size of the Publications List "+setPu.size());
                setPu.stream().forEach(sp-> {
                    tempListTitles.add(sp.getTitle());
                    tempListIdMed.add(sp.getPubMedId());
                });
                Set<Treatment>setTr = sd.getTreatments();
                /*setTr.stream().forEach(sp-> {
                    tempListTreatments.add(sp.getTreatmentName());
             });*/
             temp.setListPubObject(setPu);
             temp.setListTreatObject(setTr);
             siteDataViewDTOList.add(temp);
        });

        return siteDataViewDTOList;
    }

    private TypedQuery<SiteData> buildQuery(List<Filter> listFilters){
        CriteriaBuilder cb = em.getCriteriaBuilder();
        CriteriaQuery<SiteData> cq = cb.createQuery(SiteData.class);
        Root<SiteData> siteData = cq.from(SiteData.class);
        Join<SiteData, Category> cat = siteData.join("category", JoinType.LEFT);
        Join<SiteData, Location> loc = siteData.join("location",JoinType.LEFT);
        Join<SiteData, Treatment> tre = siteData.join("treatments",JoinType.LEFT);
        Join<SiteData, Study> stu = siteData.join("study",JoinType.LEFT);
        Join<Study, Publication> pub = stu.join("publications",JoinType.LEFT);

        List<Predicate> predicates = new ArrayList<>();
        int index = 0;

        for(Filter filter : listFilters){
            if("country".equals(filter.getName()))
                predicates.add(cb.equal(loc.get("country"), cb.parameter(String.class, filter.getName())));
            else if("category".equals(filter.getName()))
                predicates.add(cb.equal(cat.get("name"), cb.parameter(String.class, filter.getName())));
            else if("studyRef".equals(filter.getName()))
                predicates.add(cb.equal(stu.get("ref"), cb.parameter(String.class, filter.getName())));
            else if("studyType".equals(filter.getName()))
                predicates.add(cb.equal(stu.get("studyType"), cb.parameter(String.class, filter.getName())));
            else if("pubMedId".equals(filter.getName()))
                predicates.add(cb.equal(pub.get("pubMedId"), cb.parameter(Integer.class, filter.getName())));
            index++;
        }
        cq.where(cb.and(predicates.toArray(new Predicate[0])));

        return em.createQuery(cq);
    }
}   
Caused by: org.hibernate.QueryException: could not resolve property: publications of: org.wwarn.vivax.manager.domain.Study
    at org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:83)
    at org.hibernate.persister.entity.AbstractPropertyMapping.toType(AbstractPropertyMapping.java:77)
    at org.hibernate.persister.entity.AbstractEntityPersister.toType(AbstractEntityPersister.java:1978)
    at org.hibernate.hql.internal.ast.tree.FromElementType.getPropertyType(FromElementType.java:367)