2010-09-17 7 views
10

Tôi đang cố gắng chỉnh sửa một bảng trong Postgresql bằng cách sử dụng JPA trong Glassfish bằng EclipseLink. Khi tôi chèn một thực thể, nó chạy tốt. Tuy nhiên, khi tôi cố gắng chỉnh sửa hoặc loại bỏ cùng một thực thể, nó không thành công với lỗi sau. Bất kỳ ý tưởng?Không có toán tử nào khớp với tên và kiểu đối số đã cho. Bạn có thể cần phải thêm phôi loại rõ ràng. - Netbeans, Postgresql 8.4 và Glassfish

 
Caused by: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.0.1.v20100213-r6600): org.eclipse.persistence.exceptions.DatabaseException 
Internal Exception: org.postgresql.util.PSQLException: ERROR: operator does not exist: integer = character varying 
    Hint: No operator matches the given name and argument type(s). You might need to add explicit type casts. 
    Position: 38 
Error Code: 0 
     at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:333) 
     at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.processExceptionForCommError(DatabaseAccessor.java:1422) 
     at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect(DatabaseAccessor.java:799) 
     at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeNoSelect(DatabaseAccessor.java:867) 
     at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:587) 
     at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeCall(DatabaseAccessor.java:530) 
     at org.eclipse.persistence.internal.sessions.AbstractSession.executeCall(AbstractSession.java:914) 
     at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:205) 
     at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:191) 
     at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.deleteObject(DatasourceCallQueryMechanism.java:182) 
     at org.eclipse.persistence.internal.queries.StatementQueryMechanism.deleteObject(StatementQueryMechanism.java:101) 
     at org.eclipse.persistence.queries.DeleteObjectQuery.executeDatabaseQuery(DeleteObjectQuery.java:167) 
     at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:675) 
     at org.eclipse.persistence.queries.DatabaseQuery.executeInUnitOfWork(DatabaseQuery.java:589) 
     at org.eclipse.persistence.queries.ObjectLevelModifyQuery.executeInUnitOfWorkObjectLevelModifyQuery(ObjectLevelModifyQuery.java:109) 
     at org.eclipse.persistence.queries.DeleteObjectQuery.executeInUnitOfWorkObjectLevelModifyQuery(DeleteObjectQuery.java:112) 
     at org.eclipse.persistence.queries.ObjectLevelModifyQuery.executeInUnitOfWork(ObjectLevelModifyQuery.java:86) 
     at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2857) 
     at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1225) 
     at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1207) 
     at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1167) 
     at org.eclipse.persistence.internal.sessions.CommitManager.deleteAllObjects(CommitManager.java:297) 
     at org.eclipse.persistence.internal.sessions.CommitManager.deleteAllObjects(CommitManager.java:256) 
     at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitToDatabase(UnitOfWorkImpl.java:1406) 
     at org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.commitToDatabase(RepeatableWriteUnitOfWork.java:547) 
     at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitToDatabaseWithChangeSet(UnitOfWorkImpl.java:1508) 
     at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.issueSQLbeforeCompletion(UnitOfWorkImpl.java:3128) 
     at org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.issueSQLbeforeCompletion(RepeatableWriteUnitOfWork.java:268) 
     at org.eclipse.persistence.transaction.AbstractSynchronizationListener.beforeCompletion(AbstractSynchronizationListener.java:157) 
     at org.eclipse.persistence.transaction.JTASynchronizationListener.beforeCompletion(JTASynchronizationListener.java:68) 
     at com.sun.enterprise.transaction.JavaEETransactionImpl.commit(JavaEETransactionImpl.java:412) 
     ... 25 more 
Caused by: org.postgresql.util.PSQLException: ERROR: operator does not exist: integer = character varying 
    Hint: No operator matches the given name and argument type(s). You might need to add explicit type casts. 
    Position: 38 
     at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2062) 
     at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1795) 
     at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257) 
     at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:479) 
     at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:367) 
     at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:321) 
     at com.sun.gjc.spi.base.PreparedStatementWrapper.executeUpdate(PreparedStatementWrapper.java:108) 
     at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect(DatabaseAccessor.java:792) 
     ... 53 more 
Java Result: 1 
+0

Xin chỉ cho tổ chức của bạn, bảng tương ứng, có thể mã của bạn nếu có liên quan, và SQL tạo ra. Xem [câu hỏi trước này] (http://stackoverflow.com/questions/2374395/is-it-possible-to-output-generated-sql-using-eclipselink-without-having-to-increa) để xuất SQL được tạo ra . –

+0

Để không hack bạn ORM và postgres phần mềm bên ngoài cho phép bạn đăng ký phôi của riêng bạn và so sánh các hoạt động. [Hãy xem ví dụ trong câu hỏi tương tự] (http://stackoverflow.com/questions/20773805/postgresql-enum-and-character-varying-updating/43748427#43748427). P.S. Đó là câu trả lời, nhưng đã bị xóa bởi một số lý do… – Hubbitus

Trả lời

8

này lỗi chính:

ERROR: operator does not exist: integer = character varying

Bạn đang cố gắng để phù hợp với một số nguyên và một chuỗi, đó không phải đi làm việc. Sửa mã của bạn, nhận được truy vấn có liên quan để xem bạn đã sửa chưa. Xem thêm các tệp nhật ký PostgreSQL.

Cách giải quyết (KHÔNG PHẢI GIẢI PHÁP!) Là thực hiện một số thao tác truyền. Check this article.

+0

bạn có thấy điều gì đã ném lên điều này không? – RMcNairn

11

Tôi gặp sự cố này và đã được giải quyết. Điều này là do mệnh đề WHERE chứa giá trị String thay vì giá trị số nguyên.

0

Bro, tôi đã gặp vấn đề tương tự. Thing là tôi đã xây dựng một trình tạo truy vấn, một trình xây dựng khá phức tạp, xây dựng các vị từ của anh ấy đang chờ động về các tham số đã được thiết lập và lưu trữ các truy vấn. Dù sao, trước khi tôi xây dựng trình tạo truy vấn của mình, tôi đã có một mã thủ tục không hướng đối tượng xây dựng cùng một thứ (ngoại trừ dĩ nhiên anh ta không lưu trữ các truy vấn và tham số) làm việc hoàn hảo. Bây giờ khi builder của tôi đã cố gắng để làm điều tương tự, PostgreSQL của tôi đã ném này fucked lên lỗi mà bạn nhận được quá. Tôi đã kiểm tra mã SQL đã tạo và không tìm thấy lỗi nào. Thực sự kỳ lạ.

Tìm kiếm của tôi sớm chứng minh rằng đó là một vị ngữ cụ thể trong mệnh đề WHERE gây ra lỗi này. Tuy nhiên, biến vị ngữ này được xây dựng bằng mã trông giống như, gần như, chính xác là như mã thủ tục trông như thế nào trước khi ngoại lệ này bắt đầu xuất hiện từ hư không.

Nhưng tôi thấy một điều tôi đã làm khác trong công cụ xây dựng của tôi trái ngược với mã thủ tục trước đây. Đó là số đơn đặt hàng của các vị từ mà anh đặt trong mệnh đề WHERE! Vì vậy, tôi bắt đầu di chuyển vị từ này xung quanh và sớm phát hiện ra rằng thực sự thứ tự của các vị từ có nhiều điều để nói. Nếu tôi đã có biến vị ngữ này một mình, truy vấn của tôi đã hoạt động (nhưng trả về một kết quả sai lầm), nếu tôi chỉ cho anh ta một hoặc một biến vị ngữ khác đôi khi nó không hoạt động. Hơn nữa, bắt chước thứ tự trước của mã thủ tục cũng không hoạt động. Điều cuối cùng đã làm là đặt biến vị ngữ ma quỷ này vào đầu mệnh đề WHERE của tôi, như là vị từ đầu tiên được thêm vào! Vì vậy, một lần nữa nếu tôi đã không làm cho bản thân mình rõ ràng, thứ tự các vị từ của tôi khi được thêm vào mệnh đề/mệnh đề WHERE đã tạo ra ngoại lệ này.

0

Tôi đoán điều này có thể do nhiều thứ. Trong trường hợp của tôi, nó đã có điều kiện "WHERE id IN" trong truy vấn của tôi và tôi đã đặt ID được phân cách bằng dấu gạch ngang làm chuỗi bằng cách sử dụng phương thức setString trên PreparedStatement.

Không chắc chắn nếu có cách nào tốt hơn để làm điều này nhưng tôi chỉ cần thêm trình giữ chỗ trong tuyên bố của tôi và thay thế nó bằng các giá trị của riêng tôi.

0

Nếu có ai là có ngoại lệ này và đang xây dựng các truy vấn sử dụng Scala chuỗi đa dòng:

Hình như có một vấn đề với một số tài xế JPA trong tình huống này. Tôi không chắc chắn nhân vật Scala sử dụng cho LINE END là gì, nhưng khi bạn có một tham số ở cuối dòng, ký tự LINE END dường như được gắn vào tham số và khi trình điều khiển phân tích cú pháp truy vấn, lỗi xuất hiện.Một tác phẩm đơn giản xung quanh là để lại một khoảng trống ngay sau khi param ở cuối:

SELECT * FROM some_table a 
WHERE a.col = ?param 
AND a.col2 = ?param2 

Vì vậy, chỉ cần đảm bảo để lại một khoảng trống sau param (và param2, nếu bạn có một ngắt dòng đó).

0

Nếu bạn đang sử dụng Primefaces, bạn nên chèn bên trong tệp .xhtml để nó chuyển đổi chính xác thành số nguyên java. Ví dụ:

<p:selectCheckboxMenu 
    id="frameSelect" 
    widgetVar="frameSelectBox" 
    filter="true" 
    filterMatchMode="contains" 
    label="#{messages['frame']}" 
    value="#{platform.frameBean.selectedFramesTypesList}" 
    converter="javax.faces.Integer"> 
    <f:selectItems 
     value="#{platform.frameBean.framesTypesList}" 
     var="area" 
     itemLabel="#{area}" 
     itemValue="#{area}" /> 
</p:selectCheckboxMenu> 
1

Có vẻ như bạn không có câu trả lời nhưng vấn đề này cũng có thể tăng lên nếu bạn chuyển ID không vào JPA Predicate.

Ví dụ:

Nếu tôi đã thực hiện truy vấn trên Mèo để lấy lại danh sách. Trả về 3 kết quả.

Danh sách catList;

Tôi sau đó lặp lại Danh sách mèo đó và lưu trữ khóa nhận biết của mèo có lẽ leashTypeId trong danh sách khác.

List<Integer> leashTypeIds= new ArrayList<>(); 

for(Cats c : catList){ 
    leashTypeIds.add(c.getLeashTypeId); 
} 

jpaController().findLeashes(leashTypeIds); 

Nếu bất kỳ con mèo nào trong catList có null leashTypeId, nó sẽ ném lỗi này khi bạn cố gắng truy vấn DB của bạn.

(Chỉ cần nhận ra tôi đang đăng trên một sợi cũ 5 năm, có lẽ ai đó sẽ tìm thấy hữu ích này)