【问题标题】:Spring boot @Column annotation on method instead of field?方法而不是字段上的Spring引导@Column注释?
【发布时间】:2022-02-03 02:37:38
【问题描述】:

我试图通过创建一个名称对象将我的类分成更小的部分,但是当我这样做时,用户存储库无法从字符串中找到用户,并且似乎需要一个名称对象。

@Entity
@Table(name = "users")
public class UserDTO {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name="id", insertable = false, updatable = false, nullable = false)
    private UUID id;

    private Name name;

    @Column(name = "name")
    public String getName() {
        return name.toString();
    }
@Value
@Embeddable
public class Name {
    String name;
}

我希望能够使用 String 而不是 Name 对象来查找用户,因为我希望 Name 对象与 UserDTO 类隔离

@Repository
public interface UserRepository extends CrudRepository<UserDTO, UUID> {
    List<UserDTO> findAll(Pageable limit);
    UserDTO findByName(String name);
}

我得到的错误是

Parameter value [1] did not match expected type [Name (n/a)]

我认为是因为 String 与 Name 对象不匹配。

【问题讨论】:

    标签: java spring-boot


    【解决方案1】:

    您的代码中有很多设计问题:

    • 您不应在存储库类中使用dto 类,而应使用实体类。作为最佳实践,它应该在您的Rest Controller 中使用并映射到您的实体模型,然后再将其传递给您的Service。看看here
    • 当您使用UUID 时,您定义生成策略的方式应该有所不同。看看here
    • 您没有兴趣将 name 字段包装成另一种类型,因为您可以使用它的 String 值并且它只包含一个字段。
    • 更喜欢在您的字段上使用@Column 注释而不是getter 方法。这只是个人选择。看看here

    现在回答您的问题,您的错误来自于您返回 String 而不是 Name 类型。

    您的课程可能如下所示:

    实体:

    @Entity
    @Table(name = "USER")
    public class User {
    
        @Id
        @GeneratedValue(generator = "UUID")
        @GenericGenerator(
            name = "UUID",
            strategy = "org.hibernate.id.UUIDGenerator",
        )
        @Column(name = "id", updatable = false, nullable = false)
        private UUID id;
    
        @Column(name = "name")
        private String name;
    
        public String getName() {
            return name;
        }
    }
    

    Dto:

    public class UserDto {
    
        private UUID id;
    
        private String name;
    
        public String getName() {
            return name;
        }
    
        // Other getters and setters
    }
    

    存储库:

    @Repository
    public interface UserRepository extends CrudRepository<User, UUID> {
        List<User> findAll(Pageable limit);
        User findByName(String name);
    }
    

    【讨论】:

    • 我希望能够将多个字段合并为一个,就像我可能有一个 BasicUserInfo 类,其中包含姓名、姓氏、电子邮件、密码,但希望能够在我的其余代码不知道 BasicUserInfo 的情况下按名称搜索用户。在这种情况下,它只有一个名称字段,但我希望能够从嵌套信息中找到用户
    • 我想避免自定义查询
    猜你喜欢
    • 2021-03-26
    • 2022-08-16
    • 2015-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 2013-06-26
    相关资源
    最近更新 更多