Interrogation de l’horodatage Unix à l’aide de JOOQ

J’utilise un serveur MySQL, et j’essaie de récupérer un horodatage à l’aide de l’API JOOQ. Cependant, je pense que le comportement par défaut de JOOQ renvoie l’heure dans le fuseau horaire local, et non UTC (il n’utilise pas UNIX_TIMESTAMP() . En utilisant JOOQ, ma requête ressemble à

 db.select(USER_TABLE.REGISTERED_ON) .from(USER_TABLE) .where(USER_TABLE.EMAIL.equal(email) .fetchAny() 

Cependant, le sql que je veux exécuter devrait être quelque chose comme ça

 SELECT UNIX_TIMESTAMP(schema.table.timestamp_col) FROM schema.table WHERE email="[email protected]" 

Est-il possible d’utiliser l’API JOOQ? Si ce n’est pas le cas, quel est le meilleur moyen d’exécuter cette requête, car je veux vraiment pouvoir utiliser le code généré (USER_TABLE, USER_TABLE.REGISTR_ON, etc.).

EDIT: Je fais maintenant ce qui suit, mais est-ce sûr? Fondamentalement, je supprime les citations des classes générées par JOOQ.

 Ssortingng timestamp_field = USER_TABLE.REGISTERED_ON.toSsortingng().replace("\"", ""); Field f = DSL.field("UNIX_TIMESTAMP(" + timestamp_field + ")"); Record r = db.select(f) .from(USER_TABLE) .where(USER_TABLE.EMAIL.equal(email)) .fetchAny(); 

Il existe plusieurs manières de résoudre ce problème:

Utilisez un Converter ou une Binding pour convertir le type

Vous pouvez enregistrer un type de données Converter ou Binding dans le générateur de code source. De cette façon, le générateur de code générera un Field pour chaque champ TIMESTAMP de la firebase database. Les types utiles possibles sont:

  • java.lang.Long
  • java.time.Instant
  • java.time.OffsetDateTime (notez que jOOQ 3.7 supportera cela via [# 4338]) 3

Utilisez du code SQL simple

Utilisez SQL brut chaque fois que vous souhaitez effectuer une conversion explicite à l’aide de la fonction UNIX_TIMESTAMP() . Votre solution fonctionne:

 Ssortingng timestamp_field = USER_TABLE.REGISTERED_ON.toSsortingng().replace("\"", ""); Field f = DSL.field("UNIX_TIMESTAMP(" + timestamp_field + ")"); 

Mais ce n’est pas recommandé car:

  • Vous ne devriez jamais vous fier à une implémentation de toSsortingng() d’un type Java.
  • Vous devriez généralement essayer d’éviter la concaténation de chaînes avec l’API SQL simple de jOOQ

Une meilleure solution serait:

 DSL.field("UNIX_TIMESTAMP({0})", Long.class, USER_TABLE.REGISTERED_ON); 

Ou même:

 public static Field unixTimestamp(Field arg) { return DSL.field("UNIX_TIMESTAMP({0})", Long.class, arg); } 

Utiliser BIGINT dans la firebase database

Vous pourriez bien sûr utiliser BIGINT ou BIGINT UNSIGNED dans la firebase database au lieu de TIMESTAMP . De cette façon, vous aurez toujours automatiquement la valeur d’horodatage unix entier. Ceci est juste une solution de contournement pour la perfection.