[JAVA] Verwenden Sie benutzerdefinierte Datenbankfunktionen von JPQL

Überblick

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

Beispielcode

Benutzerdefinierte Datenbankfunktionen

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

Verwenden Sie benutzerdefinierte Funktionen mit JPQL

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)

Recommended Posts

Verwenden Sie benutzerdefinierte Datenbankfunktionen von JPQL
Verwenden Sie TensorFlow von JRuby
Verwenden Sie das C-Programm von Ruby