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)