![](/img/trans.png)
[英]java.lang.illegalargumentexception cannot set java.lang.string field to java.lang.String
[英]Can not set java.lang.String field to java.lang.String
我目前正在開發一個帶有套接字服務器的小型MMO應用程序。 我正在使用的數據庫是PostgreSQL,我使用的是Hibernate ORM。 在請求單個用戶擁有的所有頭像時,我偶然發現了一個例外。
我得到3個課程,這些是:
當用戶(客戶端應用程序)通過套接字向服務器發送請求時,將調用一個方法,該方法應返回所有Avatars的JsonString。
然而,使用from UserOwnsAvatar where user = :username
的HQL查詢from UserOwnsAvatar where user = :username
並將結果放入UserOwnsAvatar對象的ArrayList中,它返回一個Can not set java.lang.String field nl.marcusink.mmo.server.database.table.User.username to java.lang.String
完整的stackTrace是:
org.hibernate.property.access.spi.PropertyAccessException: Error accessing field [private java.lang.String nl.marcusink.mmo.server.database.table.User.username] by reflection for persistent property [nl.marcusink.mmo.server.database.table.User#username] : Mjollnir94
at org.hibernate.property.access.spi.GetterFieldImpl.get(GetterFieldImpl.java:43)
at org.hibernate.tuple.entity.AbstractEntityTuplizer.getIdentifier(AbstractEntityTuplizer.java:223)
at org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersister.java:4594)
at org.hibernate.type.EntityType.toLoggableString(EntityType.java:505)
at org.hibernate.internal.util.EntityPrinter.toString(EntityPrinter.java:87)
at org.hibernate.engine.spi.QueryParameters.traceParameters(QueryParameters.java:281)
at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:194)
at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1268)
at org.hibernate.internal.QueryImpl.list(QueryImpl.java:87)
at nl.marcusink.mmo.server.database.Database$Queries.avatarsRequest(Database.java:134)
at nl.marcusink.mmo.server.connection.GameServerClient.run(GameServerClient.java:91)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.IllegalArgumentException: Can not set java.lang.String field nl.marcusink.mmo.server.database.table.User.username to java.lang.String
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167)
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171)
at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:58)
at sun.reflect.UnsafeObjectFieldAccessorImpl.get(UnsafeObjectFieldAccessorImpl.java:36)
at java.lang.reflect.Field.get(Field.java:393)
at org.hibernate.property.access.spi.GetterFieldImpl.get(GetterFieldImpl.java:39)
... 11 more
查詢代碼是:
Query query = session.createQuery("from UserOwnsAvatar where user = :username");
query.setParameter("username", username);
ArrayList<UserOwnsAvatar> ownedAvatars = (ArrayList<UserOwnsAvatar>) query.list();
最后一行是錯誤的原因,有什么想法嗎?
編輯
@Id
@ManyToOne(targetEntity = User.class)
@JoinColumn(name = "username", nullable = false)
private User user;
@Id
@OneToOne(targetEntity = Avatar.class)
@JoinColumn(name = "avatar", nullable = false, unique = true)
private Avatar avatar;
此處的用戶名等於User對象的用戶名,即:
@Id
@Column(name = "username", unique = true, nullable = false)
private String username;
您必須設置完整(或僅包含相關字段的對象)而不是該對象的一個特定值。
我所理解的是您在設置參數時嘗試設置String
,但該列的類型為User
。 Hibernate試圖在String
上調用getUsername
方法,這就是錯誤的原因。
所以將代碼更改為以下內容:
User user = getSomeUser();
Query query = session.createQuery("from UserOwnsAvatar where user.username = :username");
query.setParameter("username", user);
user =:username不正確。 user不是實體的字符串字段。 使用連接或使用休眠條件為User創建別名並添加限制,例如.add(Restriction.eq(“user.username”,username)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.