简体   繁体   English

无法将java.lang.String字段设置为java.lang.String

[英]Can not set java.lang.String field to java.lang.String

I am currently developing a small MMO application with a socket server. 我目前正在开发一个带有套接字服务器的小型MMO应用程序。 The database i am using is PostgreSQL and i am using the Hibernate ORM. 我正在使用的数据库是PostgreSQL,我使用的是Hibernate ORM。 I stumbled on to a exeption when requesting all the avatars an single user owns. 在请求单个用户拥有的所有头像时,我偶然发现了一个例外。

I got 3 classes involed, those are : 我得到3个课程,这些是:

  • GameServerClient GameServerClient
  • Database 数据库
  • Database.Queries Database.Queries

When the user (client application) sends a request to the server via the sockets, a method is called which should return a JsonString of the all the Avatars. 当用户(客户端应用程序)通过套接字向服务器发送请求时,将调用一个方法,该方法应返回所有Avatars的JsonString。

How ever, using the HQL query from UserOwnsAvatar where user = :username and puting the result in an ArrayList of the UserOwnsAvatar object it returns an Can not set java.lang.String field nl.marcusink.mmo.server.database.table.User.username to java.lang.String 然而,使用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

the full stackTrace is : 完整的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

the query code is : 查询代码是:

Query query = session.createQuery("from UserOwnsAvatar where user = :username");
query.setParameter("username", username);
ArrayList<UserOwnsAvatar> ownedAvatars = (ArrayList<UserOwnsAvatar>) query.list();

The last line is the cause of the error, any ideas? 最后一行是错误的原因,有什么想法吗?

EDIT 编辑

@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;

The username here is equal to the username of the User object, which is : 此处的用户名等于User对象的用户名,即:

@Id
@Column(name = "username", unique = true, nullable = false)
private String username;

You will have to set the complete (or object with only relevant fields) instead of one particular value of that object. 您必须设置完整(或仅包含相关字段的对象)而不是该对象的一个​​特定值。

What I understood is you are trying to set a String while setting the parameter, but the column is of type User . 我所理解的是您在设置参数时尝试设置String ,但该列的类型为User Hibernate is trying to call the getUsername method on String and that's why the error. Hibernate试图在String上调用getUsername方法,这就是错误的原因。

So change your code to something like this: 所以将代码更改为以下内容:

User user = getSomeUser();
Query query = session.createQuery("from UserOwnsAvatar where user.username =  :username");
query.setParameter("username", user);

user = :username is incorrect. user =:username不正确。 user is not a string field of the entity. user不是实体的字符串字段。 Either use a join or use hibernate criteria to create a alias for User and add a restriction, for ex, .add(Restriction.eq("user.username",username). 使用连接或使用休眠条件为User创建别名并添加限制,例如.add(Restriction.eq(“user.username”,username)。

暂无
暂无

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

相关问题 java.lang.illegalargumentexception 无法将 java.lang.string 字段设置为 java.lang.String - java.lang.illegalargumentexception cannot set java.lang.string field to java.lang.String 不能Marshal java.lang.String - Can't Marshal java.lang.String 扩展 java.lang.String - Extend java.lang.String [java.lang.String中; 无法强制转换为java.lang.String - [java.lang.String; cannot be cast to java.lang.String How to solve this error “cannot resolve method 'addData(java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String)'”? - How to solve this error “cannot resolve method 'addData(java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String)'”? 无法将java.lang.String字段CustomersEntity.address设置为CustomersEntity,CustomerEntity中的address字段有问题吗? - Can not set java.lang.String field CustomersEntity.address to CustomersEntity,Is something wrong with the address field in CustomerEntity? Java String import java.lang.String - Java String import java.lang.String 无法解析构造函数'SlideModel(java.lang.String, java.lang.String)'? - Can't Cannot resolve constructor 'SlideModel(java.lang.String, java.lang.String)'? 无法将 [B 字段 fr.mypackage.MyClass.data 设置为 java.lang.String - Can not set [B field fr.mypackage.MyClass.data to java.lang.String Can not set java.lang.Integer field com.persistence.entity.CustomerOrderEntity.tenantId to java.lang.String - Can not set java.lang.Integer field com.persistence.entity.CustomerOrderEntity.tenantId to java.lang.String
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM