πŸ”™λ’€λ‘œκ°€κΈ°

μ‚¬μš©μž μ •μ˜ ν•¨μˆ˜ 호좜

ν•˜μ΄λ²„λ„€μ΄νŠΈλŠ” μ‚¬μš© μ „ 방언에 μΆ”κ°€ν•΄μ•Ό ν•œλ‹€.

  1. μ‚¬μš©ν•˜λŠ” DB 방언을 μƒμ†λ°›λŠ” μƒˆλ‘œμš΄ 클래슀λ₯Ό μƒμ„±ν•œλ‹€.
  2. μƒμ„±ν•œ ν΄λž˜μŠ€μ—μ„œ registerFunction() λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ‚¬μš©μž μ •μ˜ ν•¨μˆ˜λ₯Ό λ“±λ‘ν•œλ‹€.
import org.hibernate.dialect.MySQL5Dialect;
import org.hibernate.dialect.function.StandardSQLFunction;
import org.hibernate.type.StandardBasicTypes;

public class CustomMySQLDialect extends MySQL5Dialect {

    public CustomMySQLDialect() {
        super();
        registerFunction("my_function", new StandardSQLFunction("my_function", StandardBasicTypes.STRING));
    }
}
  1. persistence.xml λ˜λŠ” ν•˜μ΄λ²„λ„€μ΄νŠΈ μ„€μ • νŒŒμΌμ—μ„œ λ°©μ–Έ 섀정을 λ³€κ²½ν•˜μ—¬ μƒˆλ‘œμš΄ 클래슀λ₯Ό μ‚¬μš©ν•˜λ„λ‘ ν•œλ‹€.
<persistence ...>
    <persistence-unit ...>
        ...
        <properties>
            ...
            <property name="hibernate.dialect" value="com.example.CustomMySQLDialect"/>
            ...
        </properties>
    </persistence-unit>
</persistence>

JPQLμ΄λ‚˜ Criteria APIμ—μ„œ ν˜ΈμΆœν•œλ‹€.

String jpql = "SELECT m FROM Member m WHERE my_function(m.name) = 'something'";
TypedQuery<Member> query = entityManager.createQuery(jpql, Member.class);
List<Member> members = query.getResultList();
select function('group_concat', i.name) from Item i