Jooq-Java用の「LINQ」、JavaコードのタイプセーフなSQLクエリビルダー

最近、JDBCとORMの中間点を探して、興味深いオープンソースライブラリ( Apacheソフトウェアライセンス )に出会いました。これを使用すると、JavaコードでSQLを非常に便利かつ安全に直接構築できます。 ライブラリはJooqと呼ばれます 。 Jooqには、データベースの構造を解析して必要なJavaクラスを作成するコードジェネレーターが含まれています。 実際、次のような結果が得られます。



Integer taskId = sqlFactory.select(ID).from(TASK).where(STATUS.equal(TaskStatus.QUEUED)). orderBy(LAST_UPDATED).limit(1).fetchOne(ID);
      
      







ご覧のとおり、クエリを作成して単純な型で実行すると、1行かかります。 jooqについて少し:







私たちに何が良いですか?





何が問題なのですか?





 Integer taskId = sqlFactory.select(Task.ID).from(Task.TASK).where(Task.STATUS.equal(TaskStatus.QUEUED)). orderBy(Task.LAST_UPDATED).limit(1).fetchOne(Task.ID);
      
      









主観性





 Field<Integer> jobTypeCountField = Job.JOBTYPE_ID.count().as("JOBTYPE_ID_COUNT"); Result<Record> jobTypeCountRecord = null; jobTypeCountRecord = sqlFactory.select(Job.JOBTYPE_ID, jobTypeCountField).from(Job.JOB) .where(Job.STATUS.equal(JobStatus.EXECUTING)).groupBy(Job.JOBTYPE_ID).fetch(); for (Record record : jobTypeCountRecord) { System.out.println(record.getValue(Job.JOBTYPE_ID) + " - " - record.getValue(jobTypeCountField)); }
      
      







ただし、この主題に関する意見は異なる場合があります。 このようなコードは、誰かにとってより理解しやすいように思われます。





Jooq アナログ







より多くの類似物、わずかに異なる計画







連絡先の詳細:







Jooqソースからのいくつかの例(MySQLのinformation_schemaデータベースを使用)





おそらく、ここの例を見て、 Gishiの構文を強調して見方が良いでしょう。



  select(KeyColumnUsage.CONSTRAINT_NAME, KeyColumnUsage.TABLE_NAME, KeyColumnUsage.COLUMN_NAME) .from(KEY_COLUMN_USAGE).join(TABLE_CONSTRAINTS) .on(KeyColumnUsage.TABLE_SCHEMA.equal(TableConstraints.TABLE_SCHEMA)) .and(KeyColumnUsage.TABLE_NAME.equal(TableConstraints.TABLE_NAME)) .and(KeyColumnUsage.CONSTRAINT_NAME.equal(TableConstraints.CONSTRAINT_NAME)) .where(TableConstraints.CONSTRAINT_TYPE.equal(constraintType)) .and(KeyColumnUsage.TABLE_SCHEMA.equal(getSchemaName())) .orderBy(KeyColumnUsage.TABLE_NAME.ascending(), KeyColumnUsage.ORDINAL_POSITION.ascending()).fetch()
      
      







  for (Record record : create().select( ReferentialConstraints.CONSTRAINT_NAME, ReferentialConstraints.TABLE_NAME, ReferentialConstraints.REFERENCED_TABLE_NAME, ReferentialConstraints.UNIQUE_CONSTRAINT_NAME, KeyColumnUsage.COLUMN_NAME) .from(REFERENTIAL_CONSTRAINTS) .join(KEY_COLUMN_USAGE) .on(ReferentialConstraints.CONSTRAINT_SCHEMA.equal(KeyColumnUsage.CONSTRAINT_SCHEMA)) .and(ReferentialConstraints.CONSTRAINT_NAME.equal(KeyColumnUsage.CONSTRAINT_NAME)) .where(ReferentialConstraints.CONSTRAINT_SCHEMA.equal(getSchemaName())) .orderBy( KeyColumnUsage.CONSTRAINT_NAME.ascending(), KeyColumnUsage.ORDINAL_POSITION.ascending()) .fetch()) { String foreignKey = record.getValue(ReferentialConstraints.CONSTRAINT_NAME); String foreignKeyColumn = record.getValue(KeyColumnUsage.COLUMN_NAME); String foreignKeyTableName = record.getValue(ReferentialConstraints.TABLE_NAME); String referencedKey = record.getValue(ReferentialConstraints.UNIQUE_CONSTRAINT_NAME); String referencedTableName = record.getValue(ReferentialConstraints.REFERENCED_TABLE_NAME); TableDefinition foreignKeyTable = getTable(foreignKeyTableName); if (foreignKeyTable != null) { ColumnDefinition column = foreignKeyTable.getColumn(foreignKeyColumn); String key = getKeyName(referencedTableName, referencedKey); relations.addForeignKey(foreignKey, key, column); } }
      
      






All Articles