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
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
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)