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:
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 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:
toSsortingng()
d’un type Java. 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); }
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.