![](/img/trans.png)
[英]How I can show column name in postman using Jpa if I am writing native query having only specific columns
[英]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.