我有一個@Entity類公司,它有幾個屬性,在我的db中引用一個公司表。其中一個代表一個Map companyProperties,其中公司表由company_properties表擴展,並且屬性以鍵值格式保存。JPQL在select語句中包含elementCollection地圖
@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
}
實體管理器能夠正確地執行查找條款
Company company = entityManager.find(Company.class, companyId);
不過,我不能在這個實體執行JPQL查詢和檢索相應的地圖。由於對象很大,我只需要在實體類中選擇一些屬性。我也不想根據companyProperties進行過濾,但是要檢索所有與合適的分配的公司ID外鍵一起使用的商品。我試圖做的是以下幾點:
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();
的錯誤我得到的是:
java.lang.IllegalArgumentException異常: 異常說明:編譯問題[而創造的EntityManager查詢時出現異常SELECT c.id,c.name,c.companyProperties FROM Company as c where c.id =:id]。 [21,40]狀態字段路徑'c.companyProperties'不能被解析爲集合類型。 org.eclipse.persistence.internal.jpa.EntityManagerImpl.createQuery(EntityManagerImpl.java:1616) org.eclipse.persistence.internal.jpa.EntityManagerImpl.createQuery(EntityManagerImpl.java:1636) com.sun.enterprise.container .common.impl.EntityManagerWrapper.createQuery(EntityManagerWrapper.java:476)
試圖與加入做到這一點(我的最遠點與
Query query = entityManager.createQuery("SELECT c.id, c.name, p " +
"FROM Company c LEFT JOIN c.companyProperties p where c.id = :id");
不給我任何正確的結果(這隻返回屬性的值而不是它們的鍵值列表)
如何定義正確的查詢來執行此操作?
您不能在結果子句中包含多值項目,因爲任何JPQL文檔都會告訴您 –