2017-04-20 3 views
1

Ich habe die folgenden Tabellen mit Beziehung ManyToManyZugang Composite-Schlüssel in Hibernate Criteria

Aufgabe Tabelle:

[TASK_ID] pk 
    ,[TASK_NAME] 

Option Tabelle:

[OPTION_ID] pk 
     ,[OPTION_VALUE] 

und die task_options Tabelle, die zusammengesetzten Primärschlüssel enthalten von den zwei Fremdschlüsseln der vorherigen Tabellen

[TASK_ID] 
     ,[OPTION_ID] 

und es ist Mapping wie folgt:

Task_Options.java 
@Entity 
@Table(name = "TASK_OPTIONS") 
public class Task_Options implements Serializable { 

    @EmbeddedId 
    private pk pk; 

    @ManyToOne 
    @MapsId("Task_ID") 
    private Task task; 

    @ManyToOne 
    @MapsId("Option_ID") 
    private Options options; 

    public Task getTask() { 
     return task; 
    } 

    public void setTask(Task task) { 
     this.task = task; 
    } 

    public Options getOptions() { 
     return options; 
    } 

    public void setOptions(Options options) { 
     this.options = options; 
    } 

    /*Inner Class for Composite primary key*/ 
    @Embeddable 
    public static class pk implements Serializable { 

     private int Task_ID;   
     private int Option_ID; 

     public pk(int Task_ID, int Option_ID) { 
      this.Task_ID = Task_ID; 
      this.Option_ID = Option_ID; 
     } 

     @Override 
     public int hashCode() { 
      int hash = 7; 
      hash = 47 * hash + this.Task_ID; 
      hash = 47 * hash + this.Option_ID; 
      return hash; 
     } 

     @Override 
     public boolean equals(Object obj) { 
      if (this == obj) { 
       return true; 
      } 
      if (obj == null) { 
       return false; 
      } 
      if (getClass() != obj.getClass()) { 
       return false; 
      } 
      final pk other = (pk) obj; 
      if (this.Task_ID != other.Task_ID) { 
       return false; 
      } 
      if (this.Option_ID != other.Option_ID) { 
       return false; 
      } 
      return true; 
     } 

    } 

} 

i erstellen möchten Hibernate Kriterien die folgende Abfrage ausführen

select OPTION_VALUE from [dbo].[OPTION] AS op      
    INNER JOIN [dbo].[TASK_OPTIONS] AS TSOP ON op.OPTION_ID = TSOP.OPTION_ID 
    INNER JOIN [dbo].[TASK] AS tsk ON tsk.TASK_ID = TSOP.TASK_ID 
    Where Tsk.TASK_ID = 2 

ich dieses

   Criteria criteria = session.createCriteria(Task_Options.class, "Tsop"); 
       criteria.createAlias("Tsop.Task_ID", "task"); 
       criteria.createAlias("Tsop.Option_ID", "op"); 
       criteria.add(Restrictions.eqProperty("Tsop.task.Task_ID", "task.task_ID")); 
       criteria.add(Restrictions.eqProperty("Tsop.options.Option_ID", "op.option_ID")); 

funktioniert nicht versucht haben, wegen Task_ID von Task_options können nicht aufgelöst werden.

Antwort

0

Sie brauchen nicht @EmbeddedId private pk pk;. Hibernate kann Objekte auflösen, die Ids zugeordnet sind.

Können Sie mit diesen Kriterien versuchen?

Criteria criteria = session.createCriteria(Task_Options.class, "Tsop"); 
criteria.createAlias("task", "task"); 
criteria.createAlias("options", "op"); 
criteria.add(Restrictions.eqProperty("task.task_id", 2)); 
Verwandte Themen