このクエリをメタモデルで実行したいのですが、できません!! これを行う方法がわかりません。
MYSQL QUERYClases
(このクエリでは、この時点で教えているテーブルからすべての行を取得したい):
SELECT * FROM clases cl
WHERE CURRENT_TIME() BETWEEN
(SELECT ml2.inicio FROM modulos ml2 WHERE cl.modulo_id=ml2.modulo_id ) AND
(SELECT ml2.fin FROM modulos ml2 WHERE cl.modulo_id=ml2.modulo_id) AND
cl.fecha=CURRENT_DATE();
これらは私のエンティティです:
エンティティモジュロ
@Entity
@Table(name = "modulos")
public class Modulos implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "modulo_id")
private Integer moduloId;
@Basic(optional = false)
@Column(name = "inicio")
@Temporal(TemporalType.TIME)
private Date inicio;
@Basic(optional = false)
@Column(name = "fin")
@Temporal(TemporalType.TIME)
private Date fin;
@Basic(optional = false)
@Column(name = "modulo")
private String modulo;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "modulos")
private List<GruposHorarioHasModulos> gruposHorarioHasModulosList;
//getters and setters...
}
エンティティ クラス
@Entity
@Table(name = "clases")
public class Clases implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "clase_id")
private Integer claseId;
@Basic(optional = false)
@Column(name = "aula")
private String aula;
@Basic(optional = false)
@Column(name = "fusion")
private boolean fusion = false;
@Basic(optional = false)
@Column(name = "clase_numero")
private Integer claseNumero;
@Basic(optional = false)
@Column(name = "clase_impartida")
private boolean claseImpartida = false;
@JoinColumn(name = "modulo_id", referencedColumnName = "modulo_id")
@ManyToOne(optional = false)
private Modulos modulos;
//getters and setters...
}
私はこれを持っています:
EntityManager em1 = Persistence.createEntityManagerFactory("myPU").createEntityManager();
CriteriaBuilder cb = em1.getCriteriaBuilder();
CriteriaQuery cq = cb.createQuery();
Root<Clases> root = cq.from(Clases.class);
cq.select(root.get(Clases_.claseId));
Subquery<Date> sqOne = cq.subquery(Date.class);
Root<Modulos> root2 = sqOne.from(Modulos.class);
sqOne.select(root2.get(Modulos_.inicio));
Subquery<Date> horaInicio = sqOne.select(root2.get(Modulos_.inicio)).where(
cb.equal(
root2.get(Modulos_.moduloId),
root.get(Clases_.modulos).get(Modulos_.moduloId)
)
);
Subquery<Date> sqTwo = cq.subquery(Date.class);
Root<Modulos> root3 = sqTwo.from(Modulos.class);
Subquery<Date> horaFin = sqTwo.select(root3.get(Modulos_.fin)).where(
cb.equal(
root3.get(Modulos_.moduloId),
root.get(Clases_.modulos).get(Modulos_.moduloId)
)
);
cq.where(cb.between(cb.currentTime(), horaInicio, horaFin));
em1.createQuery(cq).getResultList();
このコードでは、次の例外が発生します。
スレッド「メイン」の例外 java.lang.ClassCastException: org.eclipse.persistence.internal.jpa.querydef.SubQueryImpl は org.eclipse.persistence.internal.jpa.querydef.ExpressionImpl にキャストできません
この条項を変更するとwhere
...
cq.where(cb.between(cb.currentTime(), new Date(), new Date()));
where
...動作しますが、サブクエリがないと、サブクエリからエラーが発生したことがわかりますが、この句を変更すると、その理由がわかりません...
cq.where(cb.greaterThan(cb.currentTime(), horaInicio));
...私はこれを取得します:
SELECT t0.clase_id FROM clases t0, clases t1 WHERE (CURRENT_TIME > (SELECT t2.inicio FROM modulos t3, modulos t2 WHERE ((t2.modulo_id = t3.modulo_id) AND (t3.modulo_id = t0.modulo_id))))
問題は between 句の 2 つのサブクエリであることがわかります。
これについて助けが必要です。答えを探すのに 2 週間費やしましたが、... 何もありません... 助けてください。JPA 2.0 を Netbeans と EclipseLink とメタモデル ジェネレーターと Java 6 で使用しています。メタモデルと基準ビルダーと基準クエリを使用して実行したい
ご覧のとおり、where
節でサブクエリを実行する必要があり、その節では、次のように、各パラメーターにサブクエリがwhere
ある場所を実行する必要があります。between
SELECT * FROM X WHERE CURRENT_TIME BETWEEN **MY_SUBQUERY_ONE** AND **MY_SUBQUERY_TWO**