繁体   English   中英

如何使用JPA本机查询正确访问where子句内的varray列?

[英]How can I properly access a varray column inside of a where clause using a JPA Native Query?

因此,我正在创建一个按钮,以使用CustomerId,电话号码或客户电子邮件来检索一位客户的结果。 我对JPA还是很陌生,直到最近我才听说过'varray'数据类型。

这是我使用的方法的代码:

public Customer findOneCustomerByUniqueValue(String queryValue) { 
    Customer querySingleResult = null;  
    try {
        if (queryValue.matches("[0-9]+")) {
            querySingleResult = entityManager.createQuery(
                "SELECT c FROM Customer c "
              + "WHERE c.customerId = :queryValue",
                Customer.class)
                .setParameter("queryValue", Long.parseLong(queryValue))
                .getSingleResult();
            this.findOneCustomer(Integer.parseInt(queryValue));
        }
        else {
            Object[] row = (Object[]) entityManager.createNativeQuery(
                "SELECT * FROM CUSTOMERS c, TABLE(PHONE_NUMBERS) p "
              + "WHERE c.CUST_EMAIL = :queryValue OR p.COLUMN_VALUE = :queryValue")
                .setParameter("queryValue", queryValue)
                .getSingleResult();     
            if (row != null) {
                querySingleResult = new Customer();
                querySingleResult.setCustomerId((Long) row[0]);
                querySingleResult.setCustFirstName((String) row[1]);
                querySingleResult.setCustLastName((String) row[2]);
                querySingleResult.setCustAddress((CustomerAddress) row[3]);
                querySingleResult.setPhoneNumbers((List<String>) row[4]);
                querySingleResult.setNlsLanguage((String) row[5]);
                querySingleResult.setNlsTerritory((String) row[6]);
                querySingleResult.setCreditLimit((BigDecimal) row[7]);
                querySingleResult.setCustEmail((String) row[8]);
                querySingleResult.setAccountManager((Employee) row[9]);
                querySingleResult.setDateOfBirth((Date) row[10]);
                querySingleResult.setMaritalStatus((String) row[11]);
                querySingleResult.setGender((String) row[12]);
                querySingleResult.setIncomeLevel((String) row[13]);
            }

        }

    } catch(NoResultException e) {
        querySingleResult = null;
    }

    return querySingleResult;
}

在对象数组声明中使用当前查询时,出现错误:

Caused by: org.hibernate.MappingException: No Dialect mapping for JDBC type: 2002

但是,如果我将p.COLUMN_VALUE更改为p.COLUMN_NAME ,我的错误将变为:

Caused by: Error : 904, Position : 78, Sql = SELECT * FROM CUSTOMERS c, TABLE(PHONE_NUMBERS) p WHERE c.CUST_EMAIL = :1 OR p.COLUMN_NAME = :2 , OriginalSql = SELECT * FROM CUSTOMERS c, TABLE(PHONE_NUMBERS) p WHERE c.CUST_EMAIL = ? OR p.COLUMN_NAME = ?, Error Msg = ORA-00904: "P"."COLUMN_NAME": invalid identifier

我究竟做错了什么?

最可能的原因是您正在执行选择“ *”,因此,即使您使用的是TABLE函数,您仍然会得到返回的对象类型。

例如

SQL> create or replace type numlist as varray(5) of number;
  2  /

Type created.

SQL>
SQL>
SQL> create table cust ( cid int, phone numlist );

Table created.

SQL>
SQL> insert into cust values (1, numlist(1,2,3,4));

1 row created.

SQL> insert into cust values (2, numlist(5,6,7,8,9));

1 row created.


SQL>
SQL> select *
  2  from  cust c, table(c.phone) p
  3  where c.cid = 1 or p.column_value = 6;

       CID PHONE                          COLUMN_VALUE
---------- ------------------------------ ------------
         1 NUMLIST(1, 2, 3, 4)                       1
         1 NUMLIST(1, 2, 3, 4)                       2
         1 NUMLIST(1, 2, 3, 4)                       3
         1 NUMLIST(1, 2, 3, 4)                       4
         2 NUMLIST(5, 6, 7, 8, 9)                    6

您可能只想选择所需的列,从而避免返回复杂的对象类型

SQL>
SQL> select c.cid, p.column_value
  2  from  cust c, table(c.phone) p
  3  where c.cid = 1 or p.column_value = 6;

       CID COLUMN_VALUE
---------- ------------
         1            1
         1            2
         1            3
         1            4
         2            6

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM