2014-01-15 8 views
5

Ich habe meine Entity:Hibernate Kriterien mit EmbeddedId

@Entity 
@Table(name="performances") 
@AssociationOverrides({ 
    @AssociationOverride(name="id.player", [email protected](name="player_id")), 
    @AssociationOverride(name="id.season", [email protected](name="season_id")) 
}) 
public class Performance extends AbstractEntity<PerformanceID> { 

    private static final long serialVersionUID = 1L; 

    @EmbeddedId 
    @Getter @Setter 
    private PerformanceID id; 
    @Getter @Setter 
    private int goals; 

    public Player getPlayer(){ 
     return id.getPlayer(); 
    } 

    public Season getSeason(){ 
     return id.getSeason(); 
    } 

und:

@Embeddable 
public class PerformanceID implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @ManyToOne(fetch=FetchType.LAZY, targetEntity=Player.class) 
    @JoinColumn(name="player_id") 
    @Getter @Setter 
    private Player player; 
    @ManyToOne(fetch=FetchType.LAZY, targetEntity=Season.class) 
    @JoinColumn(name="season_id") 
    @Getter @Setter 
    private Season season; 

Wie Leistungsnachweise wählen, in dem Spieler Namen 'Claudio' haben? In HQL funktioniert es einfach:

Query query = getSession().createQuery("from Performance where id.player.name = 'Claudio'"); 
return query.list(); 

Aber ich muss es durch Criteria API tun. Folgende Code wird fehlschlagen:

Criteria criteria = getSession().createCriteria(Performance.class); 
criteria.add(Restrictions.ilike("id.player.name", "Claudio")); 
return criteria.list(); 

org.hibernate.QueryException: id.player.name von: pl.andrzejcichon.criterionlazydatamodel.entities.Performance bei org.hibernate.persister konnte nicht Eigentum lösen .entity.AbstractPropertyMapping.propertyException (AbstractPropertyMapping.java:83) bei org.hibernate.persister.entity.AbstractPropertyMapping.toColumns (AbstractPropertyMapping.java:98) bei org.hibernate.persister.entity.BasicEntityPropertyMapping.toColumns (BasicEntityPropertyMapping .java: 61) bei org.hibernate.persister.entity.AbstractEntityPersister.toColumns (AbstractEntityPersister.java:1912) bei org.hibernate.loader.criteria.CriteriaQueryTranslator.getColumns (CriteriaQueryTranslator.java:523) bei org.hibernate.loader .criteria.CriteriaQueryTranslator.findColumns (CriteriaQueryTranslator.java:538) bei org.hibernate.criterion.LikeExpression.toSqlString (LikeExpression.java:80) bei org.hibernate.loader.criteria.CriteriaQueryTranslator.getWhereCondition (CriteriaQueryTranslator.java : 419) unter org.hibernate.loader.criteria.CriteriaJoinWalker. (KriterienJoinWalker.java:123) unter org.hibernate.loader.criteria.CriteriaJoinWalker. (CriteriaJoinWalker.java:92) bei org.hibernate.loader.criteria.CriteriaLoader. (CriteriaLoader.java:93) bei org.hibernate.internal.SessionImpl.list (SessionImpl.java:1599) bei org.hibernate.internal.CriteriaImpl.list (CriteriaImpl.java:374) bei pl.andrzejcichon.criterionlazydatamodel.repository.impl.PerformanceDatabaseRepository.customList (PerformanceDatabaseRepository.java:29) bei pl .andrzejcichon.criterionlazydatamodel.repository.impl.PerformanceDatabaseRepositoryTest.test (PerformanceDatabaseRepositoryTest.java:24) bei sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Methode) um sun.reflect.NativeMethodAccessorImpl.invoke (unbekannte Quelle) um sun.reflect.DelegatingMethodAccessorImpl.invoke (Unknown Source) bei java.lang.reflect.Method.invoke (Unknown Source) bei org.junit.runners.model.FrameworkMethod $ 1.runReflectiveCall (FrameworkMethod.java:45) bei org.junit.internal.runners.model.ReflectiveCallable.run (ReflectiveCallable.java:15) bei org.junit.runners.model.FrameworkMethod.invokeExplosively (FrameworkMethod.java:42) bei org.junit.internal .runners.statements.InvokeMethod.evaluate (InvokeMethod.java:20) bei org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate (RunBeforeTestMethodCallbacks.java:74) bei org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate (RunAfterTestMethodCallbacks.java:83) bei org.springframework.test.context.junit4.statements.SpringRepeat.evaluate (SpringRepeat.java:72) bei org.springframework.test.context.junit4.SpringJUnit4ClassRunner. runChild (SpringJUnit4ClassRunner.java:231) bei org.junit.runners.BlockJUnit4ClassRunner.runChild (BlockJUnit4ClassRunner.java:47) bei org.junit.runners.ParentRunner $ 3.run (ParentRunner.java:231) bei org. junit.runners.ParentRunner $ 1.schedule (ParentRunner.java:60) um org.junit.runners.ParentRunner.runChildren (ParentRunner.java:229) um org.junit.runners.ParentRunner.access $ 000 (ParentRunner.java: 50) unter org.jun it.runners.ParentRunner $ 2.Bewertung (ParentRunner.java:222) bei org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate (RunBeforeTestClassCallbacks.java:61) bei org.springframework.test.context. junit4.statements.RunAfterTestClassCallbacks.evaluate (RunAfterTestClassCallbacks.java:71) bei org.junit.runners.ParentRunner.run (ParentRunner.java:300) bei org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run (SpringJUnit4ClassRunner. java: 174) bei org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run (JUnit4TestReference.java:50) bei org.eclipse.jdt.internal.junit.runner.TestExecution.run (TestExecution. Java: 38) bei org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests (RemoteTestRunner.java:467) bei org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests (RemoteTestRunner.java:683) bei org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run (RemoteTestRunner.java:390) bei org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main (RemoteTestRunner.java:197)

Der andere Versuch:

Criteria criteria = createCriteria(); 
criteria.createAlias("id.player", "player"); 
criteria.add(Restrictions.ilike("player.name", "Claudio")); 
return criteria.list(); 

generieren query:

Hibernate: wählen this_.player_id als player2_1_0_, this_.season_id als season3_1_0_, this_.goals als goals1_0_ aus den Vorstellungen this_ wo player1_.name ilike?

Aber es wird mit SQLGrammarException fehlschlagen: "für Tabellen player1_ FROM-Klausel fehlt"

Antwort

0

Ihre Zuordnung ist falsch. Eine Klasse EmbeddableId sollte @Id (also Serializable) Werte, keine Zuordnungen oder komplexe Typen enthalten. Sie sollten Ihre Zuordnungen in Ihre Entitätsklasse verschieben und dann nur ihre IDs in die Klasse EmbbedableId aufnehmen. Siehe das folgende Beispiel (aus der JPA 2.2-Spezifikation)

@Embeddable 
public class DependentId { 
    String name; 
    long empPK; // corresponds to PK type of Employee 
} 

@Entity 
public class Dependent { 
    @EmbeddedId DependentId id; 

    // id attribute mapped by join column default 
    @MapsId("empPK") // maps empPK attribute of embedded id 
    @ManyToOne Employee emp; 
}