[JAVA] Utiliser les fonctions définies par l'utilisateur de la base de données de JPQL

Aperçu

Il s'agit d'une application implémentée par Spring Boot et Spring Data JPA (ORM est Hibernate), et est un exemple de code qui utilise une fonction définie par l'utilisateur (create function xxx ...) de la base de données de JPQL.

environnement

référence

Exemple de code

Fonctions définies par l'utilisateur de la base de données

Il s'agit d'une fonction définie par l'utilisateur utilisée dans l'exemple JPQL. Renvoie la somme des deux arguments.

DELIMITER //

DROP FUNCTION IF EXISTS calculate//

CREATE FUNCTION calculate(x INT, y INT) RETURNS INT
DETERMINISTIC
CONTAINS SQL
BEGIN
    RETURN x + y;
END
//

SHOW WARNINGS//

DELIMITER ;
select calculate(1,1);
+----------------+
| calculate(1,1) |
+----------------+
|              2 |
+----------------+
1 row in set (0.00 sec)

Dialect

Personnalisez Dialect pour enregistrer les fonctions définies par l'utilisateur. Cette implémentation est requise lors de l'utilisation de fonctions définies par l'utilisateur dans la clause select. Non requis pour une utilisation dans la clause where.

package com.example.domain.datasource;

import org.hibernate.dialect.MySQL5Dialect;
import org.hibernate.dialect.function.StandardSQLFunction;
import org.hibernate.type.IntegerType;

public class CustomMySQLDialect extends MySQL5Dialect {
    public CustomMySQLDialect() {
        super();
        registerFunction("calculate",
                new StandardSQLFunction("calculate", new IntegerType()));
    }
}

application.yml

Spécifiez dans application.yml pour utiliser la boîte de dialogue personnalisée.

spring:
  jpa:
    properties:
      hibernate:
        dialect: com.example.domain.datasource.CustomMySQLDialect

Utiliser des fonctions définies par l'utilisateur avec JPQL

Pour utiliser une fonction définie par l'utilisateur, écrivez FUNCTION ('nom de la fonction', argument 1, argument 2, ...).

Integer result = (Integer) entityManager.createQuery("SELECT FUNCTION('calculate', i.price, 100) FROM Item AS i WHERE i.id=:id")
        .setParameter("id", 1L)
        .getSingleResult();
System.out.println(result);
// → 300

SQL émis

select
    calculate(item0_.price,
    100) as col_0_0_ 
from
    item item0_ 
where
    item0_.id=?

À propos, bien qu'il ne figure pas dans l'exemple de code, le prix de l'ID d'entité Item = 1 est de 200.

select price from item where id = 1;
+-------+
| price |
+-------+
|   200 |
+-------+
1 row in set (0.00 sec)

Recommended Posts

Utiliser les fonctions définies par l'utilisateur de la base de données de JPQL
Utilisez TensorFlow de JRuby
Utiliser le programme C de Ruby