使用 Camel-Case 的 Hibernate 空属性值
Hibernate Null Attribute Value using Camel-Case
使用
Hibernate 5.3,Spring Boot 2.1,MySQL,在 Windows 10 OS.
中运行
我所知道的
我已经在我的 phpmyadmin 上验证了属性的大小写。只要大小写与我的实体 class 的属性相同,您就不必在该实体中显式定义列名。并且不需要使用 @Column(name="tableattribute")
。
问题
执行查询后,已正确检索到行数。例如,我的数据库包含5条记录,List包含5个员工对象,但实体的所有属性始终returns为空值。
我想删除在每个属性上显式声明列名并确保它在实际服务器中工作,这可能会导致列名和属性名的大小写出现问题。
尝试过
我尝试在每个属性上添加 @Column('column Name all lowercase')
并检索值。
学习后,我验证了table列是否为小写,但不是小写。相反,它仍然遵循我的 SQL 命令中的驼峰式大小写来创建 table.
MySQL Table
CREATE TABLE `personal` (
`empID` int(11) NOT NULL,
`empNumber` varchar(15) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
`surname` varchar(50) NOT NULL DEFAULT '',
`firstname` varchar(50) NOT NULL DEFAULT '',
`middlename` varchar(50) NOT NULL DEFAULT '',
`middleInitial` varchar(10) DEFAULT NULL,
`nameExtension` varchar(10) DEFAULT '',
`salutation` varchar(15) NOT NULL DEFAULT ''
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
实体
只要@Column 并以小写形式指定列名,该实体现在就可以正常工作。但是把每个属性都加上@Column并且指定字段名全部小写就很烦人了
@Entity
@Table(name="personal")
public class Employee implements Serializable {
@Id
@Column(name="empID")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@NotNull
@Column(name="empnumber")
private String empNumber;
private String surname;
private String firstname;
private String middlename;
@Column(name="middleinitial")
private String middleInitial;
@Column(name="nameextension")
private String nameExtension;
}
DAO 上的实际查询片段
@Autowired
private EntityManager entityManager;
@Override
public List<Employee> findAll() {
Session currentSession = entityManager.unwrap(Session.class);
Query<Employee> query = currentSession.createQuery("from Employee", Employee.class);
return query.getResultList();
}
您可以通过设置
来更改该行为
spring.jpa.hibernate.naming.physical-strategy
spring.jpa.hibernate.naming.implicit-strategy
您的 application.properties 中的属性。关于如何自己实现策略,可以查看official docs。
编辑 1:
spring.jpa.hibernate.naming.physical-strategy = org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
spring.jpa.hibernate.naming.implicit-strategy = org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl
使用
Hibernate 5.3,Spring Boot 2.1,MySQL,在 Windows 10 OS.
中运行我所知道的
我已经在我的 phpmyadmin 上验证了属性的大小写。只要大小写与我的实体 class 的属性相同,您就不必在该实体中显式定义列名。并且不需要使用 @Column(name="tableattribute")
。
问题
执行查询后,已正确检索到行数。例如,我的数据库包含5条记录,List包含5个员工对象,但实体的所有属性始终returns为空值。
我想删除在每个属性上显式声明列名并确保它在实际服务器中工作,这可能会导致列名和属性名的大小写出现问题。
尝试过
我尝试在每个属性上添加 @Column('column Name all lowercase')
并检索值。
学习后,我验证了table列是否为小写,但不是小写。相反,它仍然遵循我的 SQL 命令中的驼峰式大小写来创建 table.
MySQL Table
CREATE TABLE `personal` (
`empID` int(11) NOT NULL,
`empNumber` varchar(15) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
`surname` varchar(50) NOT NULL DEFAULT '',
`firstname` varchar(50) NOT NULL DEFAULT '',
`middlename` varchar(50) NOT NULL DEFAULT '',
`middleInitial` varchar(10) DEFAULT NULL,
`nameExtension` varchar(10) DEFAULT '',
`salutation` varchar(15) NOT NULL DEFAULT ''
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
实体
只要@Column 并以小写形式指定列名,该实体现在就可以正常工作。但是把每个属性都加上@Column并且指定字段名全部小写就很烦人了
@Entity
@Table(name="personal")
public class Employee implements Serializable {
@Id
@Column(name="empID")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@NotNull
@Column(name="empnumber")
private String empNumber;
private String surname;
private String firstname;
private String middlename;
@Column(name="middleinitial")
private String middleInitial;
@Column(name="nameextension")
private String nameExtension;
}
DAO 上的实际查询片段
@Autowired
private EntityManager entityManager;
@Override
public List<Employee> findAll() {
Session currentSession = entityManager.unwrap(Session.class);
Query<Employee> query = currentSession.createQuery("from Employee", Employee.class);
return query.getResultList();
}
您可以通过设置
来更改该行为spring.jpa.hibernate.naming.physical-strategy
spring.jpa.hibernate.naming.implicit-strategy
您的 application.properties 中的属性。关于如何自己实现策略,可以查看official docs。
编辑 1:
spring.jpa.hibernate.naming.physical-strategy = org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
spring.jpa.hibernate.naming.implicit-strategy = org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl