【问题标题】:Mixed parameter strategies - use just one of named, positional or JPA-ordinal strategy混合参数策略 - 仅使用命名、位置或 JPA 序数策略之一
【发布时间】:2019-05-29 18:37:25
【问题描述】:

我正在从 Oracle 数据库调用函数并遇到此异常:

org.hibernate.engine.query.ParameterRecognitionException:混合参数策略 - 仅使用命名、位置或 JPA 序数策略之一

这是我的 User.java 实体。

@Entity
@Table(name = "users", schema = "myschema")
@javax.persistence.NamedNativeQuery(name = "getPass", query = "{? call = his.get_abc(:mrno)}", resultClass = User.class, hints = {
    @javax.persistence.QueryHint(name = "org.hibernate.callable", value = "true") })
public class User {

@Id
@Column(name = "USERID", nullable = false)
private String userid;

@Column(name = "MRNO")
private String mrno;

private String username;
private String password;
private String fullName;
    // Getters and Setters are written.
}

这就是我从我的一个服务类调用这个函数的方式。

public boolean validateUser(String mrno, String password) {

    String completeMrno = utils.getMedicalRecordNumber(mrno);

    EntityManagerFactory factory = Persistence.createEntityManagerFactory("his-dev");
    EntityManager entityManager = factory.createEntityManager();

    Query query = entityManager.createNamedQuery("getPass"); // <- this line is raising exception.
    query.setParameter("mrno",completeMrno); 
    List<?> results = query.getResultList();
 }

那么,为了调用返回字符串的 Oracle 函数,需要进行哪些更改。

谢谢。如果需要更多信息,请告诉我。

【问题讨论】:

  • 只是删除?和=。尝试调用 his.get_abc(:mrno)
  • @SimonMartinelli 现在我得到 java.sql.SQLException: Invalid column index 调用 query.getResultList();
  • 好的,这不适用于 Oracle。请看我的回答
  • 好的,等待您的答复。

标签: spring hibernate spring-boot jpa-2.0


【解决方案1】:

在下面找到如何使用 JPA 调用函数的示例:

Object result = entityManager.createNativeQuery("SELECT his.get_abc(:mrno) FROM DUAL")
                                      .setParameter("mrno", completeMrno)
                                      .getSingleResult();
String value = new String(result);

【讨论】:

  • java.lang.ClassCastException: [B 不能转换为 java.lang.String]
  • 所以你得到一个字节[]而不是一个字符串。我已经更新了答案
  • 我得到的字符串和数据库中存储的不一样。
  • 你得到什么字符串?
  • 用一些特殊字符编码。我尝试了简单的 JDBC 代码(没有 JPA/Hibernate),它调用函数并在字符串中得到正确的结果。
猜你喜欢
  • 2011-12-02
  • 2012-04-17
  • 2020-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-16
  • 1970-01-01
相关资源
最近更新 更多