在Hibernate Criteria中访问Composite键

时间:2017-04-20 14:47:17

标签: java hibernate

我有以下表格,其中包含ManyToMany

的关系

任务表:

 [TASK_ID] pk
    ,[TASK_NAME]

选项表:

[OPTION_ID] pk
      ,[OPTION_VALUE]

和task_options表,其中包含来自前几个表的两个外键的复合主键

[TASK_ID]
      ,[OPTION_ID]

它的映射如下:

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;
        }

    }

}

我想创建hibernate条件来执行以下查询

 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

我试过这个

                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"));

因为Task_options的Task_ID无法解决而无法正常工作。

1 个答案:

答案 0 :(得分:0)

你不需要@EmbeddedId private pk pk;。 Hibernate可以解析映射到id的对象。

你能尝试这个标准吗?

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