Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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 JPQL在select语句中包含elementCollection映射_Java_Jpa_Jpql - Fatal编程技术网

Java JPQL在select语句中包含elementCollection映射

Java JPQL在select语句中包含elementCollection映射,java,jpa,jpql,Java,Jpa,Jpql,我有一个@Entity类Company,它有几个属性,引用数据库中的companys表。其中一个表示映射CompanyProperty,其中Companys表由company_properties表扩展,属性以键值格式保存 @Entity @Table(name = "companies") public class Company extends AbstractEntity { private static final String TABLE_NAME = "companies"

我有一个@Entity类Company,它有几个属性,引用数据库中的companys表。其中一个表示映射CompanyProperty,其中Companys表由company_properties表扩展,属性以键值格式保存

@Entity
@Table(name = "companies")
public class Company extends AbstractEntity {

    private static final String TABLE_NAME = "companies";

    @Id
    @GeneratedValue(generator = TABLE_NAME + SEQUENCE_SUFFIX)
    @SequenceGenerator(name = TABLE_NAME + SEQUENCE_SUFFIX, sequenceName = TABLE_NAME + SEQUENCE_SUFFIX, allocationSize = SEQUENCE_ALLOCATION_SIZE)
    private Long id;

    //some attributes

    @ElementCollection
    @CollectionTable(name = "company_properties", joinColumns = @JoinColumn(name = "companyid"))
    @MapKeyColumn(name = "propname")
    @Column(name = "propvalue")
    private Map<String, String> companyProperties;

    //getters and setters
}
但是,我无法在此实体中执行JPQL查询并相应地检索映射。由于对象很大,我只需要选择实体类中的一些属性。我也不想按companyproperty进行筛选,而是检索所有带有正确分配的companyid外键的属性。我尝试做的是以下几点:

TypedQuery<Company> query = entityManager.createQuery("SELECT c.id, c.name, c.companyProperties " +
            "FROM Company as c where c.id = :id", Company.class);
query.setParameter("id", companyId);
Company result = query.getSingleResult();
没有给出正确的结果(它只返回属性的值,而不是带有键值的属性列表)


如何定义正确的查询来执行此操作?

我对您的JPA语法很感兴趣。在第一次查询中,您选择了
公司
实体中的各个字段。但JPA不是这样运作的;查询时,您将返回整个对象,通过该对象可以访问所需的任何字段。我建议改为采用以下守则:

TypedQuery<Company> query = entityManager.createQuery("from Company as c where c.id = :id", Company.class);
query.setParameter("id", companyId);
Company result = query.getSingleResult();
TypedQuery query=entityManager.createQuery(“以c形式从公司开始,其中c.id=:id”,Company.class);
query.setParameter(“id”,companyId);
公司结果=query.getSingleResult();
类似地,对于第二个连接查询,我建议使用以下代码:

Query query = entityManager.createQuery("SELECT c" +
        "FROM Company c LEFT JOIN c.companyProperties p WHERE c.id = :id");
query.setParameter("id", companyId);
List<Company> companies = query.getResultList();
Query Query=entityManager.createQuery(“选择c”+
“从公司c向左加入公司属性p,其中c.id=:id”);
query.setParameter(“id”,companyId);
List companys=query.getResultList();

之所以只选择
公司
而不选择属性实体,是因为属性将显示为
公司
类中的集合。假设公司和属性之间存在一对多关系,您可以从每个
公司
实体访问属性。

您希望在仅对特定字段执行选择时获得完整的
公司
对象,这是不可能的。如果您真的想节省一些内存(在大多数情况下,这不会太成功)并只选择一些字段,那么您应该看到一个
列表

List results=entityManager.createQuery(“选择c.id、c.name、p”+
“从公司c向左加入公司属性p,其中c.id=:id”)
.setParameter(“id”,公司id)
.getResultList();

此处,
结果
将包含所选字段的单个数组。您可以使用
getSingleResult
,但请注意,如果找不到结果,它将引发异常。

我不想检索整个实体,只想检索某些特定属性。原因是,因为最终我将返回对象作为rest端点的结果。我不希望我的客户机访问所有属性,我希望JPQL只允许我检索我需要的内容,而不是在查询后将它们设置为nullneed@SantiagoPerezChavez那你想寄什么就寄什么。在任何情况下,即使实体有空占位符,当您转换为JSON时,它仍然会浪费空间。如果您真的只想检索ceetain字段,那么您可以使用本机SQL查询并获得由
对象
组成的结果集。但通常在JPA中,您会返回整个实体。任何JPQL文档都会告诉您,在结果子句中不能包含多值项
TypedQuery<Company> query = entityManager.createQuery("from Company as c where c.id = :id", Company.class);
query.setParameter("id", companyId);
Company result = query.getSingleResult();
Query query = entityManager.createQuery("SELECT c" +
        "FROM Company c LEFT JOIN c.companyProperties p WHERE c.id = :id");
query.setParameter("id", companyId);
List<Company> companies = query.getResultList();
List<Object[]> results = entityManager.createQuery("SELECT c.id, c.name, p " +
        "FROM Company c LEFT JOIN c.companyProperties p  where c.id = :id")
      .setParameter("id", companyId)
      .getResultList();