bonjour, ma hierarchie veux que je fasse mes requête en utilisant l'API criteria
Voici ma requête
et mes classes
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 Session session = (Session) entityManager.getDelegate(); Criteria criteria = session.createCriteria(GrpLanguage.class, "gf"); criteria.createAlias("gf.grpLanguagePk", "grpLanguagePk1", JoinType.LEFT_OUTER_JOIN); criteria.createAlias("grpLanguagePk1.grp", "grp1", JoinType.LEFT_OUTER_JOIN); criteria.createAlias("grp1.grpPk", "grpPk1", JoinType.LEFT_OUTER_JOIN); ProjectionList projectionList = Projections.projectionList(); projectionList.add(Projections.property("grpPk1.gfCode").as("code")); projectionList.add(Projections.property("gf.gfsLabel").as("label")); criteria.setProjection(projectionList); criteria.add(Restrictions.eq("grpLanguagePk1.languageCode",languageCode)); DetachedCriteria existCriteria = DetachedCriteria.forClass(GrpLanguage.class, "gf2"); existCriteria.createAlias("gf2.grpLanguagePk", "grpLanguagePk2", JoinType.LEFT_OUTER_JOIN); existCriteria.createAlias("grpLanguagePk2.grp", "grp2", JoinType.LEFT_OUTER_JOIN); existCriteria.createAlias("grp2.grpPk", "grpPk2", JoinType.LEFT_OUTER_JOIN); existCriteria.setProjection(Projections.property("gf2.gfsLabel")); existCriteria.add(Restrictions.eqProperty("grpPk2.gfCode", "grpPk1.gfCode")); existCriteria.add(Restrictions.eqProperty("grpPk2.prCode", "grpPk1.prCode")); existCriteria.add(Restrictions.or(Restrictions.like("gf2.gfsLabel", keyWord, MatchMode.ANYWHERE).ignoreCase(),Restrictions.like("grpPk2.gfCode", keyWord, MatchMode.ANYWHERE).ignoreCase())); criteria.add(Subqueries.exists(existCriteria)); criteria.addOrder(Order.asc("grpPk1.gfCode")); criteria.setResultTransformer(new AliasToBeanResultTransformer(GfDto.class)); List<GfDto> resultSelect = criteria.list();
à l'éxécution de ma requête, j'ai l'erreur suivante
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59 public class GrpLanguage implements Serializable { @EmbeddedId private GrpLanguagePk grpLanguagePk; @Column(name = "LIB_GF", columnDefinition = CHAR_COLUMN) private String gfsLabel; ... } et @Embeddable public class GrpLanguagePk implements Serializable { public static final String CHAR_COLUMN = "char(100)"; @Column(name = "COD_LA", columnDefinition = CHAR_COLUMN) private String languageCode; @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL) @JoinColumns({ @JoinColumn(name = "COD_GF"), @JoinColumn(name = "COD_PR") }) @JsonBackReference private Grp grp; ... } et @Entity @Table(name = "LUP_GRP") @AssociationOverrides({ @AssociationOverride(name = "grpPk.GfCode", joinColumns = { @JoinColumn(name = "COD_GF") }), @AssociationOverride(name = "grpPk.PrCode", joinColumns = { @JoinColumn(name = "COD_PR") }) }) @NamedQueries({ @NamedQuery(name = "Grp.FIND_GRP_VALID", query = "SELECT g FROM Grp g WHERE g.codState=:cdStatus") }) public class Grp extends AbstractEntity implements Serializable { private static final long serialVersionUID = 1L; public static final String FIND_GRP_VALID = "Grp.FIND_GRP_VALID" ; @EmbeddedId private GrpPk grpPk; ...} et @Embeddable public class GrpPk implements Serializable { @Column(name = "COD_GF", columnDefinition = CHAR_COLUMN) private String gfCode; @Column(name = "COD_PR", columnDefinition = CHAR_COLUMN) private String prCode; ... }
pourtant, j'ai bien accédé à ma propriété grpLanguagePk en créant un alias et en y accédant à partir de mon objet principal, je ne vois pas ce qu'il ne va pas. Pourriez vous m'aider
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Caused by: 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: grpLanguagePk
Partager