J'ai une société de classe @Entity avec plusieurs attributs, référençant une table d'entreprises dans ma base de données. L'un d'entre eux représente une Map companyProperties dans laquelle la table companies est étendue par une table company_properties et les propriétés sont enregistrées au format clé-valeur.JPQL include la carte elementCollection dans l'instruction select
@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
}
Le directeur de l'entité est en mesure d'effectuer correctement trouver des clauses
Company company = entityManager.find(Company.class, companyId);
Cependant, je ne suis pas en mesure d'effectuer des requêtes JPQL dans cette entité et récupérer la carte en conséquence. Comme l'objet est grand, j'ai juste besoin de sélectionner certains des attributs de ma classe d'entité. Je ne veux pas non plus filtrer par companyProperties mais récupérer tous ceux qui viennent avec la clef étrangère de companyid assignée appropriée. Ce que j'ai essayé de faire est la suivante:
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();
L'erreur que je reçois est:
java.lang.IllegalArgumentException: Une exception est survenue lors de la création d'une requête dans EntityManager: Exception Description: Problème compilation [ SELECT c.id, c.name, c.compagnieEntreprises FROM Société comme c où c.id =: id]. [21, 40] Le chemin du champ d'état 'c.companyentrepropriétés' ne peut pas être résolu en un type de collection. 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)
Essayer de le faire avec des jointures (le plus point que je suis arrivé était avec
Query query = entityManager.createQuery("SELECT c.id, c.name, p " +
"FROM Company c LEFT JOIN c.companyProperties p where c.id = :id");
ne me donne pas soit les résultats corrects (il renvoie uniquement la valeur de la propriété et non une liste d'entre eux avec la valeur-clé.)
Comment puis-je définir la bonne requête pour cela?
Vous ne pouvez pas inclure d'éléments à valeurs multiples dans la clause de résultat comme n'importe quel document JPQL vous le dirait –