JAvaマルチテーブルクエリー
5298 ワード
引用する
以前はプロジェクトで単表クエリーをよく使用していましたが、複数のエンティティ間クエリーに関連する場合、クラウドインテリジェントな総合クエリーライブラリを直接使用することが多く、どのように調べたのか、一切知りませんでした.
Aliceの追試管理を書く時、需要:総成績は(成績設定)合格成績の表示より小さく、総合クエリーライブラリは使用できないため、多実体間のクエリーに対して初歩的な理解があった.
概要マルチテーブルクエリSpringDataが提供する を必要とする.実体倉庫は を継承する必要がある.は、 を実現する.
クエリー条件の構築
ここでは、
改善
張喜碩組長は「前のように書くのはよくなく、理解しにくい」と話した.
クエリーの構築条件では、次のように書くこともできます.
このように書くと簡単にわかるのではないでしょうか.調査の条件は、総成績が合格成績を下回っていることがわかりやすい.
まとめ
普段は雲智倉庫を使って総合的な検索を行っていますが、何の感じもありません.ある日やむを得ず自分で書いてから、もっと深く理解することができます.
ここで、張喜碩組長に感謝します.
リファレンスコード
以前はプロジェクトで単表クエリーをよく使用していましたが、複数のエンティティ間クエリーに関連する場合、クラウドインテリジェントな総合クエリーライブラリを直接使用することが多く、どのように調べたのか、一切知りませんでした.
Aliceの追試管理を書く時、需要:総成績は(成績設定)合格成績の表示より小さく、総合クエリーライブラリは使用できないため、多実体間のクエリーに対して初歩的な理解があった.
概要
JpaSpecificationExecutor
インタフェースJpaSpecificationExecutor
public interface ScoreRepository extends CrudRepository, JpaSpecificationExecutor {}
JpaSpecificationExecutor
インターフェースにおけるtoPredicate
方法 public static Specification base(final Map map) {
return new Specification() {
@Override
public Predicate toPredicate(Root root, CriteriaQuery> criteriaQuery, CriteriaBuilder criteriaBuilder) {}
}
クエリー条件の構築
logger.info(" , ");
Predicate makeupScorePredicate = criteriaBuilder
.lessThan(root.get("totalScore").as(Float.class),
root.join("courseArrangement")
.join("course")
.join("scoreSet")
.get("passScore").as(Float.class));
and
、or
接続クエリー条件ここでは、
and
の例で説明する. private Predicate predicate = null;
private CriteriaBuilder criteriaBuilder;
private void andPredicate(Predicate predicate) {
//
if (null != predicate) {
if (null == this.predicate) {
// ,
this.predicate = predicate;
} else {
// , criteriaBuilder and
this.predicate = this.criteriaBuilder.and(this.predicate, predicate);
}
}
}
改善
張喜碩組長は「前のように書くのはよくなく、理解しにくい」と話した.
クエリーの構築条件では、次のように書くこともできます.
logger.info(" , ");
Predicate makeupScorePredicate = root.get("totalScore").as(Float.class)
.lessThan(root.join("courseArrangement")
.join("course")
.join("scoreSet")
.get("passScore").as(Float.class))
このように書くと簡単にわかるのではないでしょうか.調査の条件は、総成績が合格成績を下回っていることがわかりやすい.
まとめ
普段は雲智倉庫を使って総合的な検索を行っていますが、何の感じもありません.ある日やむを得ず自分で書いてから、もっと深く理解することができます.
ここで、張喜碩組長に感謝します.
リファレンスコード
/**
*
*
* @param map
*/
public static Specification base(final Map map) {
return new Specification() {
private Predicate predicate = null;
private CriteriaBuilder criteriaBuilder;
// and . , and , OR,
private void andPredicate(Predicate predicate) {
if (null != predicate) {
if (null == this.predicate) {
this.predicate = predicate;
} else {
this.predicate = this.criteriaBuilder.and(this.predicate, predicate);
}
}
}
@Override
public Predicate toPredicate(Root root, CriteriaQuery> criteriaQuery, CriteriaBuilder criteriaBuilder) {
logger.info(" ");
this.criteriaBuilder = criteriaBuilder;
logger.info(" ");
Predicate makeupScorePredicate = criteriaBuilder.lessThan(root.get("totalScore").as(Float.class), root.join("courseArrangement").join("course").join("scoreSet").get("passScore").as(Float.class));
this.andPredicate(makeupScorePredicate);
if (null != map.get("semesterId")) {
logger.info(" ");
Predicate semesterIdPredicate = criteriaBuilder.equal(root.join("courseArrangement").join("semester").get("id").as(Long.class), map.get("semesterId"));
this.andPredicate(semesterIdPredicate);
}
if (null != map.get("gradeId")) {
logger.info(" ");
Predicate gradeIdPredicate = criteriaBuilder.equal(root.join("student").join("klass").join("grade").get("id").as(Long.class), map.get("gradeId"));
this.andPredicate(gradeIdPredicate);
}
if (null != map.get("majorId")) {
logger.info(" ");
Predicate majorIdPredicate = criteriaBuilder.equal(root.join("courseArrangement").join("course").join("major").get("id").as(Long.class), map.get("majorId"));
this.andPredicate(majorIdPredicate);
}
if (null != this.predicate) {
criteriaQuery.where(criteriaBuilder.and(this.predicate));
}
return criteriaQuery.getRestriction();
}
};
}