JPA Le champ d'état du chemin d'accès ne peut pas être résolu à un type valide
J'ai besoin d'aide pour le dépannage d'une relation /requête avec EclipseLink 2.5.x fournisseur.
De la relation de ThreePhaseMotorInput à ValidationMessage est censé être un uni-directionnelle OneToMany, c'est à dire chaque moteur peut avoir 0..n messages et en Java objet graphique ValidationMessage n'a pas de référence à ThreePhaseMotorInput.
J'obtiens une erreur que JPA ne pouvez pas trouver les attributs qui font partie de la ValidationMessage classe lors d'un accès via ThreePhaseMotor. (Voir le texte de l'erreur ci-dessous)
Merci de penser à ma question!
Requête
select msg.validationMsg, COUNT(m.id) from ThreePhaseMotorInput AS m JOIN m.valMessages AS msg GROUP BY msg.validationMsg
Erreur
org.eclipse.persistence.exceptions.JPQLException:
Exception Description: Problem compiling [select msg.validationMsg, COUNT(m.id) from ThreePhaseMotorInput AS m JOIN m.valMessages AS msg GROUP BY msg.validationMsg].
[7, 24] The state field path 'msg.validationMsg' cannot be resolved to a valid type.
[71, 84] The collection-valued path 'm.valMessages' cannot be resolved to a valid association field.
[119, 136] The state field path 'msg.validationMsg' cannot be resolved to a valid type.
ThreePhaseMotorInput classe
@Entity
@Table(name = "three_phase_motor_input")
public class ThreePhaseMotorInput implements IThreePhaseMotorInput, Serializable {
private static final long serialVersionUID = 8084370807289186987L;
@Transient
private final PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this);
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Version
private Integer version;
private Integer status;
@Transient
private Integer numMessages;
@OneToOne(cascade = CascadeType.ALL, optional = true, targetEntity = UnapprovedThreePhaseMotor.class)
@JoinColumn(name = "unapproved_id")
private IThreePhaseMotor unapprovedMotor;
@OneToOne(cascade = CascadeType.ALL, optional = true, targetEntity = ApprovedThreePhaseMotor.class)
@JoinColumn(name = "approved_id")
private IThreePhaseMotor approvedMotor;
@OneToMany(orphanRemoval = true, cascade = CascadeType .ALL, fetch = FetchType.LAZY, targetEntity = ValidationMessage.class)
@JoinColumn(name = "input_id", referencedColumnName = "id", nullable = false)
@OrderColumn(name = "idx")
private List<IValidationMessage> valMessages;
ValidationMessage classe
@Entity
@Table(name = "validation_message")
public class ValidationMessage implements Serializable, IValidationMessage {
private static final long serialVersionUID = 8765213112015434057L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "record_id")
private Long recordId;
@Column(name = "field_name")
private String fieldName;
@Column(name = "validation_msg")
private String validationMsg;
private Integer status;
@Column(name = "fail_field")
private String failField;
@Column(name = "error_source")
private Integer errorSource;
Vous avez un problème dans une requête, probablement une requête nommée. Pourriez-vous nous montrer la requête avec le problème (c'est celui-ci:
J'ai divisé la requête dans le message. C'est une requête nommée.
J'ai mis à jour la question à la révision de la requête par votre réponse ci-dessous et les messages d'erreur. Il n'arrive pas à obtenir de la ValidationMessage classe par m.valMessages.
OK. Eu corrigée et marqué votre réponse acceptée. MERCI!!
J'ai marqué Andrei réponse comme accepté, upvoted à la fois et d'attribution de la prime à 22 heures quand DONC me permet de le faire.
[select m.approvedMotor, m.valMessages, m.valMessages.validationMsg...
)? C'est qu'une requête nommée ou une requête native?J'ai divisé la requête dans le message. C'est une requête nommée.
J'ai mis à jour la question à la révision de la requête par votre réponse ci-dessous et les messages d'erreur. Il n'arrive pas à obtenir de la ValidationMessage classe par m.valMessages.
OK. Eu corrigée et marqué votre réponse acceptée. MERCI!!
J'ai marqué Andrei réponse comme accepté, upvoted à la fois et d'attribution de la prime à 22 heures quand DONC me permet de le faire.
OriginalL'auteur Timothy Vogel | 2015-02-14
Vous devez vous connecter pour publier un commentaire.
Le problème semble être dans la requête suivante:
select m.approvedMotor, m.valMessages, m.valMessages.validationMsg, count(m.valMessages.id) from ThreePhaseMotorInput m group by m.valMessages.validationMsg
.Que la requête devrait être une requête JPQL, j'.e une requête dans laquelle vous spécifiez les entités et leurs propriétés Java. Aussi, vous devez utiliser
JOIN
s si vous voulez passer à une autre entité propriétés:m.valMessages.validationMsg
n'est pas correct, maisINNER JOIN m.valMessages msg GROUP BY msg
est correct.Essayez donc la requête suivante:
OriginalL'auteur Andrei I
Vous ne pouvez pas utiliser une expression de chemin avec une valeur de Collection de l'association.
La documentation dit: JPQL des Expressions de Chemin
Dans votre requête,
m.valMessages
est illégale, car elle fait référence à une collection de ValidationMessages.Dans l'autre main,
m.approvedMotor
est légal, car il est une valeur unique de l'association.Comme le suggère Andrei réponse, vous avez besoin de modifier votre requête pour ajouter une autre expression de chemin d'accès:
OriginalL'auteur David SN
vous devez utiliser les Jointures si vous voulez passer à une autre entité propriétés. essayez la suite de la requête JPQL
OriginalL'auteur TanvirChowdhury