Spring Data JPA查询不起作用,列不存在。

3
我在我的 Web 应用中使用 Spring Data JPA,我有一个名为 User 的实体。
@Entity
public class User implements Serializable {
    private static final long serialVersionUID = 1L;

    private Long id;
    private String password;
    private String email;
    private Boolean enabled;
    private String name;
    private String lastname;
    private String userRole;

    public User() {
    }

    public User(String password, String email, Boolean enabled, String name, String lastname, String userRole) {
        this.password = password;
        this.email = email;
        this.enabled = enabled;
        this.name = name;
        this.lastname = lastname;
        this.userRole = userRole;
    }

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "users_id_seq")
    @SequenceGenerator(name="users_id_seq", sequenceName="users_id_seq", allocationSize = 1)
    @Column(name = "id", nullable = false)
        public Long getId() {
        return id;
    }

 //Other columns
}

我有一个UserRepository接口,它扩展了CrudRepository。当我在我的控制器中调用findAll方法时,我会得到这个错误

01-May-2016 22:45:58.674 WARN [http-nio-8080-exec-3] org.hibernate.engine.jdbc.spi.SqlExceptionHelper.logExceptions SQL Error: 0, SQLState: 42703
01-May-2016 22:45:58.675 ERROR [http-nio-8080-exec-3] org.hibernate.engine.jdbc.spi.SqlExceptionHelper.logExceptions Error: column user0_.id does not exist
  Position: 8

我的 spring-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:jpa="http://www.springframework.org/schema/data/jpa"

       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">

    <jpa:repositories base-package="com.birthright.repository"/>

    <bean id="myEmf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="packagesToScan" value="com.birthright.entity"/>
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>
        </property>
        <property name="jpaProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQL9Dialect</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
            </props>
        </property>
    </bean>

    <tx:annotation-driven/>

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="org.postgresql.Driver"/>
        <property name="url" value="jdbc:postgresql://localhost:5432/AutoService"/>
        <property name="username" value="postgres"/>
        <property name="password" value="root"/>
    </bean>

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="myEmf"/>
    </bean>

</beans>

我的postgresql表

CREATE TABLE public."user"
(
  id integer NOT NULL DEFAULT nextval('users_id_seq'::regclass),
  password character varying,
  email character varying,
  enabled boolean,
  name character varying,
  lastname character varying,
  user_role character varying,
  CONSTRAINT users_pkey PRIMARY KEY (id)
)

你的表中存在这个列吗? - Aritz
是的,我不知道前缀"user0_."从哪里来。 - Peter Kozlovsky
这只是Hibernate用来命名用户表的别名。 - Aritz
你为什么要把与id相关的注释放在getter方法中而不是字段本身呢? - Aritz
这是 Java EE 持久化自动生成的实体 -> 导入数据库模式。但现在我尝试添加注释 @Table(name = "user", schema = "public"),它起作用了。感谢您的关注。 - Peter Kozlovsky
1
@Birthright,请不要使用像User这样的表名,否则你会遇到很多问题。只需要用users即可。 - v.ladynev
1个回答

9

User是PostgreSQL中的保留关键字。使用默认的命名策略,您可能会得到User表名称。

不知道为什么@Table(name = "user", schema = "public")可以工作。也许PostgreSQL不认为public.userUser相反。

请使用复数形式的表名。并且为表名使用系统或子系统前缀(xxx_users)也是一个好主意。

可以使用命名策略来实现这种方法。将其作为示例参考:Hibernate5NamingStrategy

前缀的一个例子: StrategyOptions


你说得对。我删除了这些注释并将“users”表重命名,也完成了所有工作。 - Peter Kozlovsky
@Birthright 这很好。检查一下命名策略,我们的团队使用它来避免这样的问题。列命名也可能存在错误。 - v.ladynev
"User是PostgreSQL中的保留关键字。"……浪费了半天时间……感谢您的救援…… - Petr Dvořák
2
@PetrDvořák 没关系。也许你会在下一世帮助我 :) - v.ladynev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接