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);
}

这些方法现在有效,这些方法的单元测试现在也有效。

谢谢!