如何在JPA查询中使用自定义函数?

我是Spring

Jpa和Hibernate的新手。我正在尝试使用自定义函数从Oracle数据库中获取数据。我可以定义一个实体及其相关的服务,实现和存储库。此外,通过使用registerFunction下面的内容,我创建了一个新的自定义Oracle方言。

所以我有两个问题:

1)在我的Oracle数据库中,该函数位于其他模式下。我需要指定其架构吗?如果可以,怎么办?还是hibernate会自动找到它?

提供完整的堆栈跟踪信息后,我将在本文结尾处询问我的第二个问题。

这是我的完整堆栈跟踪:

package blog;

import org.hibernate.dialect.Oracle10gDialect;

import org.hibernate.dialect.function.StandardSQLFunction;

public class MyOracle10gDialect extends Oracle10gDialect {

public MyOracle10gDialect() {

super();

registerFunction("my_function", new StandardSQLFunction("my_function"));

}

}

...

spring.jpa.database-platform=blog.MyOracle10gDialect

...

package blog.models;

import javax.persistence.Column;

import javax.persistence.Entity;

import javax.persistence.Id;

import javax.persistence.Table;

@Entity

@Table(name = "item", schema = "WOS_SOURCE")

public class WosItem {

@Id

@Column(nullable = false)

private String UT;

@Column(nullable = false)

private String TI;

public String getUT() {

return UT;

}

public void setUT(String UT) {

this.UT = UT;

}

public String getTI() {

return TI;

}

public void setTI(String TI) {

this.TI = TI;

}

public WosItem(String UT, String TI) {

this.UT = UT;

this.TI = TI;

}

public WosItem() { }

@Override

public String toString() {

return "WosItem{" +

"UT='" + UT + '\'' +

", TI='" + TI + '\'' +

'}';

}

}

package blog.services;

import blog.models.WosItem;

import org.springframework.stereotype.Service;

import java.util.List;

@Service

public interface WosItemService {

List<WosItem> findAll();

WosItem findById(String id);

String find_ut(Long ut_seq);

}

package blog.services;

import blog.models.WosItem;

import blog.repositories.WosItemRepository;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;

import java.util.List;

@Service

public class WosItemServiceJpaImpl implements WosItemService {

@Autowired

private WosItemRepository wosItemRepository;

@Override

public List<WosItem> findAll() {

return this.wosItemRepository.findAll();

}

@Override

public WosItem findById(String id) {

return this.wosItemRepository.findOne(id);

}

@Override

public String find_ut(Long ut_seq) {

return this.wosItemRepository.find_ut();

}

}

package blog.repositories;

import blog.models.WosItem;

import org.springframework.data.jpa.repository.JpaRepository;

import org.springframework.data.jpa.repository.Query;

import org.springframework.stereotype.Repository;

@Repository

public interface WosItemRepository extends JpaRepository<WosItem, String> {

@Query("SELECT function('my_function', input) FROM WosItem wos");

String find_ut();

}

因此,在我的Oracle数据库中,可以如下所示使用此功能:

select other_schema.my_function(aa.input) from my_schema.TABLE aa;

对于前。说aa.input 332708100009然后返回000332708100009

至于我的第二个问题:

2)如何在jpa中执行此过程?我知道我的存储库根本不正确。我收到类似“此处不允许注释”的错误。我找不到解决此问题的方法。

提前致谢。

Caused by: java.lang.IllegalStateException: No data type for node: org.hibernate.hql.internal.ast.tree.MethodNode 

\-[METHOD_CALL] MethodNode: 'function (my_function)'

+-[METHOD_NAME] IdentNode: 'my_function' {originalText=my_function}

\-[EXPR_LIST] SqlNode: 'exprList'

\-[NAMED_PARAM] ParameterNode: '?' {name=ut_seq, expectedType=null}

回答:

不幸的是,如果您想functionSelect语句中使用自定义调用的JPA 2.1功能,那么您将需要执行一些其他操作才能使用它。

当您在where语句中使用它时,它无需任何其他操作即可工作,但是由于我想像您一样将它用于select内的我的一个项目,因此您需要:

扩展hibernate方言并注册您的功能:

package com.mypkg.dialect;

import org.hibernate.dialect.Oracle10gDialect;

import org.hibernate.dialect.function.StandardSQLFunction;

import org.hibernate.type.StringType;

public class CustomOracle10gDialect extends Oracle10gDialect {

public CustomOracle10gDialect() {

super();

registerFunction("my_function"

, new StandardSQLFunction("my_function", new StringType()));

}

}

编辑hibernate.dialect会话工厂的属性,以指向该自定义实现:

<property name="hibernate.dialect" value="com.mypkg.dialect.CustomOracle10gDialect"/>

如果需要从某个模式调用该函数,则建议这样做:

registerFunction("my_function"

, new StandardSQLFunction("schema.my_function", new StringType()));

进一步阅读-> 本机函数调用

以上是 如何在JPA查询中使用自定义函数? 的全部内容, 来源链接: utcz.com/qa/432407.html

回到顶部