如何建立多对多关系并获取构造器中的第一个元素,并且使用jpa标准?

问题描述 投票:0回答:1

我有3个类,具有两个关系OneToMany和ManyToMany如下:

@Entity
public class Company {
    private Long id;
    private boolean enabled;
    private String tradename;
    //items...

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "company")
    @OrderColumn(name = "address_index")
    private Collection<CompanyAddress> addresses;

    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(name = "companies_activities", joinColumns = @JoinColumn(name = "company_id", 
               referencedColumnName = "id"), 
    inverseJoinColumns = @JoinColumn(name = "activity_id", referencedColumnName = "id"))
    @OrderColumn(name = "activity_index")
    private Collection<CodeActivity> activities;
}

@Entity
public class CompanyAddress {
    //items...
    private String address;

    @ManyToOne
    @JoinColumn(name = "company_id", referencedColumnName = "id", nullable = false)
    private Company company;
}

和3级:

@Entity
public class CodeActivity {
    //items...
    private String code;

    @ManyToMany(mappedBy = "activities")
    private Collection<Company> companies;
}

如何检索标准构造函数指示的元素?这是带有构造函数的类:

class CurrentCompany {
      //items...

      public CurrentCompany(long id, boolean enabled, String tradename, String address, String code) {
      }
}

和存储库:

如何加入这3个类以在上一个类中重建结果,知道属性地址和活动是公司中的内容列表,并且请求的结果是单个元素(第一个),每个都有一个是否有可能通过一个单一的jpa准则恢复其主要地址和主要活动代码的公司?

public CurrentCompany getCurrentCompany(final Long companyId) {
     CriteriaBuilder builder = entityManager.getCriteriaBuilder();
     CriteriaQuery<CurrentCompany> criteriaQuery = builder.createQuery(CurrentCompany.class);

     Root<Company> root = criteriaQuery.from(Company.class);
     Join<Company, CodeActivity> activities = root.join("activities", JoinType.INNER);
     Join<Company, CompanyAddress> addresses = root.join("addresses", JoinType.LEFT);

     List<Predicate> predicates = new ArrayList<>();
     predicates.add(builder.equal(root.get("id"), companyId));

     criteriaQuery.multiselect(builder.construct(CurrentCompany.class, root.get("id"), root.get("enabled"), 
                     root.get("tradename"), addresses.get("address"), activities.get("code")));
     criteriaQuery.where(predicates.toArray(new Predicate[0]));

     //Error encountered:
     //org.springframework.dao.InvalidDataAccessApiUsageException: 
     //org.hibernate.hql.internal.ast.QuerySyntaxException:

     //What should I add in order for me to select the first address and activity element?

     return entityManager.createQuery(criteriaQuery).getSingleResult();
}

谢谢您的答复!

hibernate jpa criteria
1个回答
0
投票

我不知道我是否已经很好地理解了这个问题,您想要给您带来的查询的第一个结果将根据第二个表和第三个表中的元素数乘以N个条目并乘以M。分别?

如果是这样,我将尝试以下操作:

 return entityManager.createQuery(criteriaQuery)
      .setFirstResult(0) // set the first result, 0 based
      .setMaxResults(1)  // set the number of recors
      .getResultList();  // you can try getSingleResult() but I prefer to use this in case there are 0 records that do not contain an error
© www.soinside.com 2019 - 2024. All rights reserved.