Dies ist eine von Spring Boot und Spring Data JPA implementierte Anwendung (ORM ist Hibernate) und ein Beispielcode, der eine benutzerdefinierte Funktion (create function xxx ...) der Datenbank aus JPQL verwendet.
Umgebung
Referenz
Dies ist eine benutzerdefinierte Funktion, die im Beispiel-JPQL verwendet wird. Gibt die Summe der beiden Argumente zurück.
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
Passen Sie Dialect an, um benutzerdefinierte Funktionen zu registrieren. Diese Implementierung ist erforderlich, wenn benutzerdefinierte Funktionen in der select-Klausel verwendet werden. Nicht erforderlich für die Verwendung in der where-Klausel.
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
Geben Sie in application.yml an, dass der angepasste Dialog verwendet werden soll.
spring:
jpa:
properties:
hibernate:
dialect: com.example.domain.datasource.CustomMySQLDialect
Um eine benutzerdefinierte Funktion zu verwenden, schreiben Sie "FUNCTION (" Funktionsname ", 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 ausgegeben
select
calculate(item0_.price,
100) as col_0_0_
from
item item0_
where
item0_.id=?
Übrigens, obwohl es nicht im Beispielcode enthalten ist, beträgt der Preis der Artikelentitäts-ID = 1 200.
select price from item where id = 1;
+-------+
| price |
+-------+
| 200 |
+-------+
1 row in set (0.00 sec)