ORM(Object-relational mapping)、OR/M、O/Rマッピングとも。

f:id:ts0818:20190927170021j:plain

点群(てんぐん)やポイントクラウドpoint cloud)とはコンピュータで扱う集合のこと。多くの場合、空間3次元であり、直交座標 (x, y, z) で表現されることが多い。

点群 (データ形式) - Wikipedia

点群の応用分野には、部品の3次元CADモデル作成、計測による品質管理可視化処理、アニメーションレンダリングマスカスタマイゼーションなどがある。

点群 (データ形式) - Wikipedia

点群はそのままレンダリングすることも可能であるが、そのデータ形式のままでは各種の3次元処理には適さないことが多い。そこでデータを面形式に変換し、ポリゴン不整三角網のメッシュ、非一様有理Bスプライン (NURBS)曲面、CADモデルなどとして扱うことが多い。

点群 (データ形式) - Wikipedia

変換手法には、ドロネー三角形分割、アルファシェイプ法など、存在する点の位置から面を生成する手法と、点群を3次元距離場(volumetric distance field)に変換し、陰的表面(implicit surface)に変換する手法がある。

点群 (データ形式) - Wikipedia

点群から得られた立体データは医用画像処理などにも用いられる。点群を利用することでデータの削減が可能である。

地理情報システムGIS)においては、点群をもとにして地面の数値標高モデル(DEM)を作成することができる。

点群 (データ形式) - Wikipedia

「ポイントクラウド」なるものが、存在すると。はい、どうもボクです。今回も全く関係のない話から入ってしまいましたけど。

Javaとデータベースの連携について、レッツトライ~。

結論、JOOQっていうORM を使おうとしたんですが、JOOQの無償版については、Oracle Ddatabaseに未対応だったことが判明し、今回はJava によるDB接続ができていませんので、お時間のある方のみご照覧ください。

2019年9月29日(日)17:00 追記 ↓ ここから

JOOQのDBサポートとか。

www.jooq.org

www.jooq.org

f:id:ts0818:20190929165102p:plain

2019年9月29日(日)17:00 追記 ↑ ここまで
 

ORM(Object-relational mapping)って?

Wikipediaさんによりますと、

オブジェクト関係マッピングObject-relational mappingO/RMORM)とは、データベースオブジェクト指向プログラミング言語の間の非互換なデータを変換するプログラミング技法である。オブジェクト関連マッピングとも呼ぶ。

実際には、オブジェクト指向言語から使える「仮想」オブジェクトデータベースを構築する手法である。オブジェクト関係マッピングを行うソフトウェアパッケージは商用のものもフリーなものもあるが、場合によっては独自に開発することもある。

オブジェクト関係マッピング - Wikipedia

であると。

図にすると、こんな感じでしょうか。

f:id:ts0818:20190927202254p:plain

Object Schema のほうには、

なんかのオブジェクトが当てはまって、

Data Schema のほうには、 

なんかのテーブルが当てはまる感じであると。 

具体的なマッピングのイメージはこんな感じかと。

f:id:ts0818:20190927221227p:plain
上記のイメージ図には描いてないですが、テーブルとかJOINして、オブジェクトにマッピングとかもあるんでしょうね、きっと。

 

ORM(Object-relational mapping)の種類

んで、ORMについては、種類が様々あると。

www.slideshare.net

⇧  上記サイト様が詳しいですが、

ORMの種類 代表的なORM
JDBCラッパー型 Spring JDBCApache Common DbUtils、sql2o
SQLマッパー型 MyBatis、DomaMirage SQL、jdbi
クエリビルダー型 JOOQ、DBFlute、Reladomo、Querydsl、Ebean、Speedment、 Jinq、requery、Cayenne、Torque

ORマッパー型
(JPA仕様の実装)

Hibernate、EclipseLink

これだけの種類があるらしい...多すぎでしょ...

ORM については、結構意見が割れていて、

qiita.com

casual-tech-note.hatenablog.com

tikasan.hatenablog.com

sekaimon.hatenablog.com

⇧  痒い所に手が届かないってところがあるため、せっかくORM使っても一部では生のSQLを使わざるを得なくなって、プロジェクトの構成が訳の分からないことになるってことも起こるらしい。

つまり、ORMは確かに便利らしいんですが、複雑なSQLには対応できない代物であるため、妥協して使用していくしかないのが現状らしい。

便利だから使ったけど、実現できないことが出てきて、調査に時間がむちゃくちゃ取られるという本末転倒パターンは、フレームワークあるあるだよね~、ドキュメントをちゃんと記載して欲しいもんですけどね。

 

とりあえず、JOOQ って ORM を使ってみる

 とりあえず、JOOQ ってORMを使ってみますか。

arakan-pgm-ai.hatenablog.com

⇧  上記サイト様を参考に、SpringBoot なプロジェクトで、JOOQ を使って、Oracle Databaseとの連携をしていこうかと。

統合開発環境としては、Eclipse を使用するので、SpringBootでプロジェクトを作る場合は、

  1. STS(Spring Tool Suite)というEclipseプラグインを導入する
  2. https://start.spring.io/ でプロジェクトの雛型を作成する

のどっちかで始める感じですかね。

STS(Spring Tool Suite)というEclipseプラグインを導入する場合は、

medium-company.com

⇧  上記サイト様を参考に構築してみてください。

 

2. https://start.spring.io/ については、

reasonable-code.com

⇧  上記サイト様によりますと、curl コマンドからも実行できるらしい。

今回はブラウザ上で、SpringBootをGradleプロジェクトとして作成で。

f:id:ts0818:20190928200839p:plain

とりあえず、依存関係には、3つほど追加。

f:id:ts0818:20190928200933p:plain

んで、「Generate - Ctrl + ↩」のボタンをクリック。

f:id:ts0818:20190928201233p:plain

zip ファイルがダウンロードされます。

f:id:ts0818:20190928201506p:plain

この中身を、Eclipseワークスペースとかに展開しました。

f:id:ts0818:20190928201703p:plain

んで、Eclipseを起動し、「ファイル(F)」>「インポート(I)...」で。

f:id:ts0818:20190928201740p:plain

SpringBootをGradleプロジェクトとして作成しているので、「Gradle」>「Existing Gradle Project」を選択で。

f:id:ts0818:20190928201847p:plain

展開しておいたGradleプロジェクトを選択。「次へ(N) >」で。

f:id:ts0818:20190928202323p:plain

「次へ(N) >」で。

f:id:ts0818:20190928202256p:plain

「完了(F) >」で。

f:id:ts0818:20190928202412p:plain

プロジェクトがインポートされました。

Oracle Database 19c のJDBCドライバをダウンロードしときます。

https://www.oracle.com/database/technologies/appdev/jdbc-downloads.html にアクセス。「Oracle Database 19c(19.3) driver - NEW!」ってのを今回はチョイス。

f:id:ts0818:20190928220752p:plain

「ojdbc8.jar」を選択。

f:id:ts0818:20190928220934p:plain

「I accept the Oracle License Agreement」のチェックっクスにチェックを入れて、「Downlod ojdbc8.jar」を選択。

f:id:ts0818:20190928222641p:plain

ダウンロードされました。

f:id:ts0818:20190928222914p:plain

そしたらば、

github.com

⇧  上記サイト様によりますと、プロジェクト直下に「lib」ディレクトリを作成するらしい、maven の場合の例だけど。

f:id:ts0818:20190928223736p:plain

f:id:ts0818:20190928223908p:plain

そしたらば、「lib」ディレクトリに、「ojdbc8.jar」を配置で。

f:id:ts0818:20190928224206p:plain

「ファイルをコピー(C)」で「OK」。

f:id:ts0818:20190928224035p:plain

f:id:ts0818:20190928224338p:plain

で、こっから、Gradleの場合はどうすんべ?ってことなんだけど、

www.jooq.org

⇧  これしか情報が無いのよね...しかもH2DB(H2 Database Engine)の場合の情報しかないって...

とりあえず、テーブルにマッピングされたObject Shcemeが配置される場所をパッケージとして作成ですかね。

f:id:ts0818:20190928230427p:plain

f:id:ts0818:20190928230526p:plain

そしたら、build.gradle を更新するようですが、

www.jooq.org

We recommend using the Gradle plugin by Etienne Studer (from Gradle Inc.).

It provides a concise DSL that allows you to tune all configuration properties supported by each jOOQ version. Please direct any support questions or issues you may find directly to the third party plugin vendor.

Running the code generator with Gradle

⇧  なんと、 外部に丸投げらしい...おすすめの方法で指定しておいて、何か問題が起きたら外部に丸投げ、責任を取らない営業の人が得意そうですね。

If you don't want to use the above third party plugin, there's also the possibility to use jOOQ's standalone code generator for simplicity. The following working example build.gradle script should work out of the box:

Running the code generator with Gradle

⇧  プラグイン使いたくない人は、groovyのxml で定義したソースコードでイケるよって言ってんだけど、H2DB(H2 Database Engine)の見本しか無いから使えんしね...Gradleに関してJOOQはやる気ないっぽいっすね。

まぁ、何にせよ、プラグインを導入していくしかないかと、だって本番環境でH2DB(H2 Database Engine)なんか使わないっしょ、普通。

んで、プラグイン

github.com

とか、導入して、設定とかするんだけど、どうしても繋がらない。ここで衝撃の事実。

github.com

Oracle Database は、JOOQ の商用版でしか使えないらしい(涙)。

私の無駄にした 3日間を返して欲しい 。

確かに、無料版のJOOQ に、Oracle Database は無いっすね...

f:id:ts0818:20190929154424p:plain

 

ダウンロードのページで、

www.jooq.org

f:id:ts0818:20190929155427p:plain

⇧  Open Source DB ってリンクをクリックすると、

JOOQのサポートDBの一覧があった...

www.jooq.org

f:id:ts0818:20190929155241p:plain
⇧  Oh, my gosh...Oracle Database not found(涙)。っていうかDBサポートの情報までのリンクが分かりにくいな~。

Oracle Database 離れが進むのも致し方ないのかもと思ってしまう今日この頃...。

 

本日の結論。ドキュメントの導線は分かりにくいけど、ドキュメントを頑張って読み解くしかない。3日間あったら、いろんなことができたのに...

今回はこのへんで。

 

NG集

結局、商用版のJOOQでしか、Oracle Database を使えないことが判明したんだけど、せっかくなんで、build.gradle の中身を備忘として掲載。

riptutorial.com

 

 

plugins {
	id 'org.springframework.boot' version '2.1.8.RELEASE'
	id 'io.spring.dependency-management' version '1.0.8.RELEASE'
	id 'java'
	id 'nu.studer.jooq' version '3.0.3' // ← gradle-jooq-plugin のために追記
}

group = 'com.ts0818'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
}

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-jooq'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	compileOnly 'org.projectlombok:lombok'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	compile fileTree(dir: 'lib', include: '*.jar') // ← ojdbc8.jar(ローカルに配置した Oracle DatabaseのJDBC)を読み込み
	compile 'org.jooq:jooq' // ← gradle-jooq-plugin のために追記
	jooqRuntime group: 'com.oracle', name: 'ojdbc8', version: '19.3.0.0' // ← gradle-jooq-plugin のために追記

}

// ↓gradle-jooq-plugin のために追記
jooq {
  version = '3.11.11'
  edition = 'OSS'
  tables(sourceSets.main) {
    jdbc {
      driver = 'oracle.jdbc.driver.OracleDriver'
      url = 'jdbc:oracle:thin@[ホスト]:[Oracleリスナーのポート]:[Oracleリスナーのサービス名]'
      user = 'oracle database にログインするためのユーザ'
      password = 'oracle database にログインするためのパスワード'
    }
    generator {
      name = 'org.jooq.codegen.DefaultGenerator'
      database {
        name = 'org.jooq.meta.oracle.OracleDatabase'
        includes= '.*'
        excludes = ''
      }
      target {
        packageName = 'db'
        directory = 'src/main/java'
      }
    }
  }
}    

んで、Gradleタスクの、build を実行すると、

f:id:ts0818:20190929163722p:plain

エラー。

f:id:ts0818:20190929163849p:plain

右クリックで、「Show Failures」をクリック。

f:id:ts0818:20190929163918p:plain

f:id:ts0818:20190929164006p:plain

 

org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':generateTablesJooqSchemaSource'.
	at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:38)
	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:416)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:406)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:165)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:250)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:158)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:102)
	at org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(DelegatingBuildOperationExecutor.java:36)
	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
	at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:43)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:355)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:343)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:336)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:322)
	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker$1.execute(DefaultPlanExecutor.java:134)
	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker$1.execute(DefaultPlanExecutor.java:129)
	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:202)
	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:193)
	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:129)
	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
	at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
	at java.lang.Thread.run(Thread.java:748)
Caused by: org.gradle.api.internal.artifacts.ivyservice.DefaultLenientConfiguration$ArtifactResolveException: Could not resolve all files for configuration ':jooqRuntime'.
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.rethrowFailure(DefaultConfiguration.java:1258)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.access$2200(DefaultConfiguration.java:139)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$ConfigurationFileCollection.getFiles(DefaultConfiguration.java:1233)
	at org.gradle.api.internal.file.AbstractFileCollection.iterator(AbstractFileCollection.java:75)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.iterator(DefaultConfiguration.java:486)
	at org.gradle.internal.fingerprint.impl.DefaultFileCollectionSnapshotter$FileCollectionLeafVisitorImpl.visitCollection(DefaultFileCollectionSnapshotter.java:60)
	at org.gradle.api.internal.file.AbstractFileCollection.visitLeafCollections(AbstractFileCollection.java:262)
	at org.gradle.api.internal.file.CompositeFileCollection.visitLeafCollections(CompositeFileCollection.java:205)
	at org.gradle.internal.fingerprint.impl.DefaultFileCollectionSnapshotter.snapshot(DefaultFileCollectionSnapshotter.java:50)
	at org.gradle.internal.fingerprint.impl.AbstractFileCollectionFingerprinter.fingerprint(AbstractFileCollectionFingerprinter.java:46)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.lambda$visitInputFileProperties$0(ExecuteActionsTaskExecuter.java:283)
	at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.lambda$fingerprintInputFiles$3(CaptureStateBeforeExecutionStep.java:154)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.visitInputFileProperties(ExecuteActionsTaskExecuter.java:281)
	at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.fingerprintInputFiles(CaptureStateBeforeExecutionStep.java:150)
	at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.createExecutionState(CaptureStateBeforeExecutionStep.java:114)
	at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:67)
	at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:47)
	at org.gradle.internal.execution.impl.DefaultWorkExecutor.execute(DefaultWorkExecutor.java:33)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:140)
	at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:62)
	at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:108)
	at org.gradle.api.internal.tasks.execution.ResolveBeforeExecutionOutputsTaskExecuter.execute(ResolveBeforeExecutionOutputsTaskExecuter.java:67)
	at org.gradle.api.internal.tasks.execution.ResolveAfterPreviousExecutionStateTaskExecuter.execute(ResolveAfterPreviousExecutionStateTaskExecuter.java:46)
	at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:94)
	at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
	at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:95)
	at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
	at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:56)
	at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
	... 27 more
Caused by: org.gradle.internal.resolve.ModuleVersionNotFoundException: Could not find com.oracle:ojdbc8:19.3.0.0.
Required by:
    project :

Root cause: org.gradle.api.internal.artifacts.ivyservice.DefaultLenientConfiguration$ArtifactResolveException: Could not resolve all files for configuration ':jooqRuntime'.
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.rethrowFailure(DefaultConfiguration.java:1258)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.access$2200(DefaultConfiguration.java:139)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$ConfigurationFileCollection.getFiles(DefaultConfiguration.java:1233)
	at org.gradle.api.internal.file.AbstractFileCollection.iterator(AbstractFileCollection.java:75)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.iterator(DefaultConfiguration.java:486)
	at org.gradle.internal.fingerprint.impl.DefaultFileCollectionSnapshotter$FileCollectionLeafVisitorImpl.visitCollection(DefaultFileCollectionSnapshotter.java:60)
	at org.gradle.api.internal.file.AbstractFileCollection.visitLeafCollections(AbstractFileCollection.java:262)
	at org.gradle.api.internal.file.CompositeFileCollection.visitLeafCollections(CompositeFileCollection.java:205)
	at org.gradle.internal.fingerprint.impl.DefaultFileCollectionSnapshotter.snapshot(DefaultFileCollectionSnapshotter.java:50)
	at org.gradle.internal.fingerprint.impl.AbstractFileCollectionFingerprinter.fingerprint(AbstractFileCollectionFingerprinter.java:46)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.lambda$visitInputFileProperties$0(ExecuteActionsTaskExecuter.java:283)
	at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.lambda$fingerprintInputFiles$3(CaptureStateBeforeExecutionStep.java:154)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.visitInputFileProperties(ExecuteActionsTaskExecuter.java:281)
	at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.fingerprintInputFiles(CaptureStateBeforeExecutionStep.java:150)
	at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.createExecutionState(CaptureStateBeforeExecutionStep.java:114)
	at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:67)
	at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:47)
	at org.gradle.internal.execution.impl.DefaultWorkExecutor.execute(DefaultWorkExecutor.java:33)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:140)
	at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:62)
	at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:108)
	at org.gradle.api.internal.tasks.execution.ResolveBeforeExecutionOutputsTaskExecuter.execute(ResolveBeforeExecutionOutputsTaskExecuter.java:67)
	at org.gradle.api.internal.tasks.execution.ResolveAfterPreviousExecutionStateTaskExecuter.execute(ResolveAfterPreviousExecutionStateTaskExecuter.java:46)
	at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:94)
	at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
	at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:95)
	at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
	at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:56)
	at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:416)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:406)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:165)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:250)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:158)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:102)
	at org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(DelegatingBuildOperationExecutor.java:36)
	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
	at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:43)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:355)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:343)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:336)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:322)
	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker$1.execute(DefaultPlanExecutor.java:134)
	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker$1.execute(DefaultPlanExecutor.java:129)
	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:202)
	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:193)
	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:129)
	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
	at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
	at java.lang.Thread.run(Thread.java:748)
Caused by: org.gradle.internal.resolve.ModuleVersionNotFoundException: Could not find com.oracle:ojdbc8:19.3.0.0.
Required by:
    project :

Root cause: org.gradle.internal.resolve.ModuleVersionNotFoundException: Could not find com.oracle:ojdbc8:19.3.0.0.
Required by:
    project :

 って起こられて、「Caused by: org.gradle.api.internal.artifacts.ivyservice.DefaultLenientConfiguration$ArtifactResolveException: Could not resolve all files for configuration ':jooqRuntime'. 」ってエラー部分で、もしやと思って、JOOQのサポートDBを見たら、無償版のJOOQじゃOracle Databaseはサポートしとらんと(涙)。