2014-06-18 3 views
1

Bonjour, Je suis en train de faire référence dans un Criteria une propriété d'une clé composite qui est définie comme et @Embeddable sur une entitéMise en veille prolongée QueryException

@Entity 
@Table(name = "B_J_P") 
public class BJP implements java.io.Serializable { 

private BJPId id; 
private BJI bJI; 

public BJP() { 
} 

public BJP(BJPId id, BJI bJI) { 
this.id = id; 
this.bJI = bJI; 
} 

@EmbeddedId 
@AttributeOverrides({ 
    @AttributeOverride(name = "jIId", column = @Column(name = "J_I_ID", nullable = false)), 
    @AttributeOverride(name = "kN", column = @Column(name = "K_N", nullable = false, length = 100)), 

public BJPId getId() { 
    return this.id; 
} 

@ManyToOne(fetch = FetchType.LAZY) 
@JoinColumn(name = "J_I_ID", nullable = false, insertable = false, updatable = false) 
public BJI getBJI() { 
    return this.bJI; 
} 
} 

je dois atteindre le kName de ce qui suit:

@Embeddable 
public class BJPId implements java.io.Serializable { 


private long jIId; 
private String kName; 

public BJPId() { 
} 

public BJPId(long jIId, String kN) { 
    this.jIId = jIId; 
    this.kN = kN; 
} 

@Column(name = "J_I_ID", nullable = false) 
public long getJIId() { 
    return this.jIId; 
} 

@Column(name = "K_NAME", nullable = false, length = 100) 
public String getKName() { 
    return this.kName; 
} 
} 

Mais quand je suis en train de l'atteindre à partir de la classe de base où BJP est une propriété avec les critères suivants

DetachedCriteria timestampFilter = DetachedCriteria.forClass(BJP.class) 
      .createAlias("id","alias") 
      .add(Restrictions.eq("alias.kName","DataSetName")) 
      .setProjection(Projections.property("kName")); 

Je reçois l'erreur suivante:

org.hibernate.QueryException: Criteria objects cannot be created directly on components. Create a criteria on owning entity and use a dotted property to access component property: id 
at org.hibernate.loader.criteria.CriteriaQueryTranslator.getPathInfo 

Comment dois-je formuler la requête de critères afin d'accéder à la propriété kName pour appliquer le filtrage basé sur dans un contexte SQL dynamique?

Si je n'ai pas fourni assez d'informations pertinentes, veuillez demander ce que j'ai oublié de fournir le contexte complet.

EDIT: Sur Genzetto conseil que j'ai réussi à atteindre les éléments (au moins il ne donne pas des erreurs maintenant), mais renvoie aucun résultat une fois que je fais:

DetachedCriteria timestampFilter = DetachedCriteria.forClass(BJP.class) 
      .add(Restrictions.eq("id.kName","DataSetName")) 
      .setProjection(Projections.property("id.kName")); 
Session currentSession = sessionFactory.getCurrentSession(); 
Criteria query = currentSession.createCriteria(BJI.class) 
      .add(Subqueries.propertyEq("bJP",timestampFilter)) 

que sur regardant le SQL est du format

... where this_.J_INST_ID = (select this_.K_NAME as y0_ from .B_J_P this_ where this_.K_NAME=?) 

il tente d'ajouter la sous-requête à l'ID de l'objet racine bien que je veux une partie de bjp. Comment puis-je l'ajouter au bon endroit?

Répondre

0

Vous n'avez pas besoin d'utiliser un alias pour cela. Vous pouvez accéder directement aux attributs de la touche composite:

DetachedCriteria timestampFilter = DetachedCriteria.forClass(BJP.class) 
      .add(Restrictions.eq("id.kName","DataSetName")) 
      .setProjection(Projections.property("id.kName")); 
+0

Merci! Votre commentaire a aidé, malheureusement rencontré un problème plus bas, savez-vous la solution à mon problème actuel par hasard s'il vous plaît? –

+0

Quel problème avez-vous eu? – Genzotto

+0

Ajouté dans mon message en haut comme modifier à la fin –

Questions connexes