java Spring MVC中的Hibernate

4zcjmb1e  于 2023-04-10  发布在  Java
关注(0)|答案(3)|浏览(133)

我在spring mvc中非常新,现在正在与hibernate斗争。我可以从ms sql server中提取数据,但字符串的长度总是设置为字段的最大值(我认为添加重复的退格键字符)。我的实体

@Entity
@Table(name = "Account")
public class Account {

    @Id
    @Column(name = "Id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    @Column(name = "Username", length = 10)
    private String username;
    @Column(name = "Password")
    private String password;

   //getter setter
    
}

我的控制器

@Controller
public class HibernateController {

    @Autowired
    SessionFactory sessionFactory; 

    @GetMapping("/getu")
    public String getUser() {
        List<Account> list = getList();
        for (Account account : list) {
            System.out.println("name: " + account.getUsername());
            System.out.println("nameLength: " + account.getUsername().length());
            System.out.println("pass: " + account.getPassword());

        }
        return "index";
    }

    @Transactional
    public List<Account> getList() {
        Session session = getSession();
        String hql = "FROM Account";
        Query query = session.createQuery(hql);
        return query.list();
    }

    public Session getSession() {
        Session session;
        try {
            session = sessionFactory.getCurrentSession();
        } catch (HibernateException e) {
            session = sessionFactory.openSession();
        }
        return session;
    }
}

这是我的表只是有字段用户名(nvarchar100)和密码(nvarchar100)而不是字符串的长度确切的长度,例如“大卫”长度是5.我的输出时,打印account.getUsername().length()总是100.请帮助我与它

uyhoqukh

uyhoqukh1#

谢谢大家的评论,我发现了问题。对于像我这样有问题的人,这个问题属于数据库的数据类型,nchar类型是固定长度类型,所以当你插入数据时,db会自动添加一些空格字符来适应。为了解决这个问题,只需使用varchar或nvarchar

wdebmtf2

wdebmtf22#

您面临的问题与@Column注解中的length属性有关。当您在Hibernate中为字符串列指定length属性时,它会设置数据库中该列的最大长度。但是,如果要保存的字符串的长度小于最大长度,Hibernate会用空格填充剩余的空间。这就是为什么您在字符串中看到重复的退格符字符的原因。
要解决此问题,您可以使用Hibernate Validator提供的@Length注解。此注解允许您设置字符串的最大长度,而无需使用空格填充剩余空间。

@Entity
@Table(name = "Account")
public class Account {

    @Id
    @Column(name = "Id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @Column(name = "Username")
    @Length(max = 10)
    private String username;

    @Column(name = "Password")
    private String password;

        // getters and setters
    }

请注意,您需要在项目中包含Hibernate Validator依赖项才能使@Length注解工作。您可以将以下依赖项添加到pom.xml文件中:

<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>7.0.1.Final</version>
</dependency>
mhd8tkvw

mhd8tkvw3#

使用@Size注解代替length。它会起作用

@Entity
@Table(name = "Account")
public class Account {

    @Id
    @Column(name = "Id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @Column(name = "Username")
    @Size(max = 10)
    private String username;

    @Column(name = "Password")
    private String password;

        // getters and setters
    }

如果仍然不起作用,请使用

@Column(length = 10)
    @org.hibernate.annotations.ColumnTransformer(
        read = "trim(my_column)",
        write = "trim(?)"
    )
    private String myColumn;

相关问题