java.lang.IllegalArgumentException: 无法将 java.lang.Long 字段 com.mypackage.User.id 设置为 java.lang.Long
java.lang.IllegalArgumentException: Can not set java.lang.Long field com.mypackage.User.id to java.lang.Long
我正在使用 Java 8 与 JPA2/Hibernate5 和 MySQL。
tables
+--------+ +----------------+ +--------------+
| User | | OrgMember | | Organization |
+--------+ +----------------+ +--------------+
| ID | | ID | | ID |
| NAME | | userId | +--------------+
+--------+ | orgId |
+----------------+
这里是连接table定义
@Entity
@Table(name = "org_members")
public class OrgMember implements Serializable
{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "userId", referencedColumnName = "id")
private User user;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "orgId", referencedColumnName = "id")
private Organization organization;
这是用户 table 的定义:
@Entity
@Table(name = "user")
public class User implements Serializable
{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
最后,这里是组织的定义 table
@Entity
@Table(name = "organization")
public class User implements Serializable
{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
我正在为 OrgMemberRepository
使用 Spring 5 数据存储库
@Repository("organizationMemberRepo")
public interface OrganizationMemberRepository extends JpaRepository<OrgMember, Long>
{
List<OrgMember> findByUser(Long userId);
List<OrgMember> findByOrganization(Long orgId);
}
而且是单元测试被破坏:
@Test
public void testFindByOrganization()
{
Long orgId = 1L;
List<OrgMember> orgMemberList =
organizationMemberRepository.findByOrganization(orgId);
assertNotNull(orgMemberList);
assertEquals(true, orgMemberList.size() > 0);
}
@Test
public void testFindByUser()
{
Long userId = 3L;
List<OrgMember> orgMemberList = organizationMemberRepository.findByUser(userId);
assertNotNull(orgMemberList);
assertEquals(true, orgMemberList.size() > 0);
}
我相信这应该是一项简单的任务,而且我相信有一个简单的修复方法。我会多尝试一下,确保我在寻找正确的东西。
谢谢!
user 是 SQL 中的保留关键字。
尝试将其更改为其他内容,看看错误是否消失。
你试过下面的方法吗
@Repository("organizationMemberRepo")
public interface OrganizationMemberRepository extends JpaRepository<OrgMember, Long>
{
List<OrgMember> findByUserId(Long userId);// or findByUser_Id
List<OrgMember> findByOrganizationId(Long orgId);// or findByOrganization_Id
}
因为在这种情况下,实现接口期间的查询生成将是 User.Id 和 Organization.Id,Long 参数将按预期工作。
并且对于可能出现的用户关键字问题,尝试将其从@Table(name = "user")
更改为@Table(name = "`user`")
是的,正如@MindhunMohan 所述,我更改了定义并且它起作用了。
我现在掌握的方法如下:
@Repository("organizationMemberRepo")
public interface OrganizationMemberRepository extends JpaRepository<OrgMember, Long>
{
List<OrgMember> findByUser(User user);
List<OrgMember> findByOrganization(Organization org);
List<OrgMember> findByUserId(Long userId);
List<OrgMember> findByOrganizationId(Long orgId);
}
这些方法现在有效,这些方法的单元测试现在也有效。
谢谢!
我正在使用 Java 8 与 JPA2/Hibernate5 和 MySQL。
tables
+--------+ +----------------+ +--------------+
| User | | OrgMember | | Organization |
+--------+ +----------------+ +--------------+
| ID | | ID | | ID |
| NAME | | userId | +--------------+
+--------+ | orgId |
+----------------+
这里是连接table定义
@Entity
@Table(name = "org_members")
public class OrgMember implements Serializable
{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "userId", referencedColumnName = "id")
private User user;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "orgId", referencedColumnName = "id")
private Organization organization;
这是用户 table 的定义:
@Entity
@Table(name = "user")
public class User implements Serializable
{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
最后,这里是组织的定义 table
@Entity
@Table(name = "organization")
public class User implements Serializable
{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
我正在为 OrgMemberRepository
使用 Spring 5 数据存储库 @Repository("organizationMemberRepo")
public interface OrganizationMemberRepository extends JpaRepository<OrgMember, Long>
{
List<OrgMember> findByUser(Long userId);
List<OrgMember> findByOrganization(Long orgId);
}
而且是单元测试被破坏:
@Test
public void testFindByOrganization()
{
Long orgId = 1L;
List<OrgMember> orgMemberList =
organizationMemberRepository.findByOrganization(orgId);
assertNotNull(orgMemberList);
assertEquals(true, orgMemberList.size() > 0);
}
@Test
public void testFindByUser()
{
Long userId = 3L;
List<OrgMember> orgMemberList = organizationMemberRepository.findByUser(userId);
assertNotNull(orgMemberList);
assertEquals(true, orgMemberList.size() > 0);
}
我相信这应该是一项简单的任务,而且我相信有一个简单的修复方法。我会多尝试一下,确保我在寻找正确的东西。
谢谢!
user 是 SQL 中的保留关键字。
尝试将其更改为其他内容,看看错误是否消失。
你试过下面的方法吗
@Repository("organizationMemberRepo")
public interface OrganizationMemberRepository extends JpaRepository<OrgMember, Long>
{
List<OrgMember> findByUserId(Long userId);// or findByUser_Id
List<OrgMember> findByOrganizationId(Long orgId);// or findByOrganization_Id
}
因为在这种情况下,实现接口期间的查询生成将是 User.Id 和 Organization.Id,Long 参数将按预期工作。
并且对于可能出现的用户关键字问题,尝试将其从@Table(name = "user")
更改为@Table(name = "`user`")
是的,正如@MindhunMohan 所述,我更改了定义并且它起作用了。
我现在掌握的方法如下:
@Repository("organizationMemberRepo")
public interface OrganizationMemberRepository extends JpaRepository<OrgMember, Long>
{
List<OrgMember> findByUser(User user);
List<OrgMember> findByOrganization(Organization org);
List<OrgMember> findByUserId(Long userId);
List<OrgMember> findByOrganizationId(Long orgId);
}
这些方法现在有效,这些方法的单元测试现在也有效。
谢谢!