相关疑难解决方法(0)

从Java/JPA调用存储过程

我正在编写一个简单的Web应用程序来调用存储过程并检索一些数据.它是一个非常简单的应用程序,它与客户端的数据库进行交互.我们传递员工ID和公司ID,存储过程将返回员工详细信息.

Web应用程序无法更新/删除数据并且正在使用SQL Server.

我正在Jboss AS中部署我的Web应用程序.我应该使用JPA来访问存储过程或CallableStatement.在这种情况下使用JPA的任何优点.

另外,调用此存储过程的sql语句是什么.我之前从未使用过存储过程,而且我正在努力解决这个问题.谷歌没有多大帮助.

这是存储过程:

CREATE procedure getEmployeeDetails (@employeeId int, @companyId int)
as
begin
    select firstName, 
           lastName, 
           gender, 
           address
      from employee et
     where et.employeeId = @employeeId
       and et.companyId = @companyId
end
Run Code Online (Sandbox Code Playgroud)

更新:

对于其他任何使用JPA调用存储过程的问题.

Query query = em.createNativeQuery("{call getEmployeeDetails(?,?)}",
                                   EmployeeDetails.class)           
                                   .setParameter(1, employeeId)
                                   .setParameter(2, companyId);

List<EmployeeDetails> result = query.getResultList();
Run Code Online (Sandbox Code Playgroud)

我注意到的事情:

  1. 参数名称对我不起作用,因此请尝试使用参数索引.
  2. 更正sql语句{call sp_name(?,?)}而不是 call sp_name(?,?)
  3. 如果存储过程返回结果集,即使您只知道一行,也getSingleResult不会工作
  4. 传递resultSetMapping名称或结果类详细信息

java sql jboss stored-procedures jpa

91
推荐指数
8
解决办法
24万
查看次数

如何调用从 JPA 返回值的自定义 Oracle 函数

我在 oracle 中有一个自定义函数,在删除记录后返回一个数字。我可以在 sql_plus 中获得一个值,例如

call my_function(4) into :out_number;
Run Code Online (Sandbox Code Playgroud)

其中 out_number 是定义为数字的变量。

当我执行“PRINT OUT_NUMBER”时,我可以验证 out_number 是否有值。

我的问题是如何从 JPA 调用这个函数。

我试过

Query query = em.createNativeQuery("{call my_function(?)}");
query.serParameter(1, 4);
return query.executeUpdate();
Run Code Online (Sandbox Code Playgroud)

并得到一个错误,基本上 my_function 未定义。如何获得 SQL_PLUS 上的 CALL...INTO 中的返回值?

如果这种方法不可取,有人可以推荐任何建议吗?JPA 是我目前唯一的选择。我可以创建一个存储过程,但我不确定是否可以从中获取返回值,因为不支持 OUT 参数。

提前感谢您的帮助!

java oracle jpa

5
推荐指数
1
解决办法
2万
查看次数

使用JPA执行数据库功能

要调用 Oracle 数据库函数,我只需编写

final Query query = entityManager.createNativeQuery(
    "select myfunction(?) from dual"
);
query.setParameter(1, "value");
Object rv = query.getSingleResult();
Run Code Online (Sandbox Code Playgroud)

只要被调用的函数不执行任何 dml 操作,此操作就有效。否则我必须执行类似的事情

    {? = call myfunction(?)}
Run Code Online (Sandbox Code Playgroud)

不幸的是,我无法注册任何 OUT 参数,因此我无法使该语句起作用。在不使用普通 JDBC 的情况下如何实现这一点?


编辑:

这个问题具有误导性。我想获取 Oracle 数据库中函数(不是存储过程)的结果。没有 OUT 参数。该函数可能如下所示:

CREATE OR REPLACE FUNCTION myfunction(value IN VARCHAR2)
RETURN VARCHAR2
IS
BEGIN
    UPDATE foo SET bar = 'foobar'
    WHERE id = 1;

    RETURN 'test';
END myfunction;
Run Code Online (Sandbox Code Playgroud)

Calling an oracle function from JPA 的答案并不能解决我的问题,因为我的函数内部存在 dml 更改。我收到错误:

无法在查询内执行 DML 操作

java hibernate jpa entitymanager

4
推荐指数
1
解决办法
2万
查看次数

JPA @NamedQuery以按位AND(&)作为条件

有谁知道如何使用按位AND(&)作为JPA NamedQuery的准则,而不必使用@NamedNativeQuery?

我将状态位存储在字段中。

我将以下def用于视图的实体:

@NamedQueries({
    @NamedQuery(name="ViewProductsList.findAll", query="SELECT v FROM ViewProductsList v"),
    @NamedQuery(name="ViewProductsList.findFeatured", query="SELECT v FROM ViewProductsList v WHERE v.statusId & 16"),
    @NamedQuery(name="ViewProductsList.findBySubcategory", query="SELECT v ViewProductsList v WHERE v.subcatId IN (:subcatIds)"),
})
Run Code Online (Sandbox Code Playgroud)

第一个工作正常,但第二个不喜欢该表达式,我得到以下信息:

18:02:13,528 DEBUG [DataNucleus.Query] - JPQL Single-String with "SELECT v FROM ViewProductsList v WHERE v.statusId & 16"
18:02:13,553 DEBUG [DataNucleus.Query] - JPQL Query : Compiling "SELECT v FROM ViewProductsList v WHERE v.statusId & 16"
>>ERROR: 'Portion of expression could not be parsed: & 16'
Run Code Online (Sandbox Code Playgroud)

在生产中使用dev MySQL数据库和Google Cloud SQL,因此它必须在两个版本上都可以使用...

有任何想法吗? …

mysql jpa datanucleus bitwise-and

1
推荐指数
1
解决办法
2842
查看次数