Большой! я обновил ответ, чтобы другие пользователи знали
ичок в Spring Jpa и Hibernate. Я пытаюсь получить данные с помощью пользовательской функции из базы данных Oracle. Я мог бы определить сущность вместе с соответствующим сервисом, реализацией и хранилищем. Кроме того, я создал новый пользовательский диалект Oracle, используяregisterFunction
как вы увидите ниже.
Итак, у меня есть два вопроса:
1) В моей базе данных Oracle функция находится под другой схемой. Нужно ли указывать его схему? Если так, то как? Или hibernate найдет его автоматически?
Я задам свой второй вопрос в конце этого поста после предоставления полной трассировки стека ...
Вот мой полный след стека:
MyOracle10gDialect
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"));
}
}
application.properties
...
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();
}
}
Repository:
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.input332708100009
потом возвращается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}