【问题标题】:JPQL query for many to manyJPQL 查询多对多
【发布时间】:2020-03-04 10:47:36
【问题描述】:

我想编写 JPQL 查询来获取具有多对多表的 id 值的行。我有两个课程:

@Entity
@Table(name = "farm")
@Getter
public class Farm {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", nullable = false)
    private Long id;

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

    @ManyToOne()
    @NotFound(action = NotFoundAction.IGNORE)
    @JoinColumn(name = "customer_id", referencedColumnName = "id")
    private Customer customer;

    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "user_farm", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "farm_id"))
    private List<User> users = new ArrayList<>();
}

@Entity
@Table(name = "user")
@Getter
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", nullable = false)
    private Long id;

    @Column(name = "email")
    private String email;

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

    @ManyToMany(mappedBy = "users")
    private List<Farm> farms = new ArrayList<>();

    @Column(name = "is_admin")
    private Boolean isAdmin;
}

还有一个存储库:

public interface FarmRepository extends JpaRepository<Farm, Long> {

    @Query("select f from Farm f join f.users u where u.id=:userId")
    List<Farm> findByUserId(@Param("userId") Long userId);
}

但是,我得到了这个休眠错误:

ERROR: column user2_.id does not exist

如何正确编写 jpql 查询以使其正常工作?

【问题讨论】:

    标签: spring hibernate spring-data-jpa


    【解决方案1】:

    错误提示查询已执行,但您的数据库表不包含 id 列。

    1. 转到您的 application.properties 文件并添加它以在您的控制台中查看 SQL:

      spring.jpa.show-sql=true

      spring.jpa.properties.hibernate.format_sql=true

    2. 执行测试,看看是否生成了正确的 SQL。

    3. 想想谁创建了您的数据库?自动创建 hbm2ddl 模式?液化石油气?飞路?架构.sql?修复您的数据库表。

    【讨论】:

      【解决方案2】:

      我想我也可能有类似的问题。表名“user”经常被保留,你不能使用它。尝试将其重命名为“人”或其他名称。可能会有所帮助。

      https://stackoverflow.com/a/30157994/9890613

      【讨论】:

      • 你来自哪里?请给我发短信到 yurait6@gmail.com
      【解决方案3】:

      据我所知,@ManyToMany 需要双向关系,但在您的示例中它是单一的。让我们看看结构:

      User:
      Long id;
      Farm:
      Long id;
      User_farm:
      Long r_user_id;
      Long r_farm_id;
      

      那么@JoinTable 必须是:

        @ManyToMany(cascade = CascadeType.ALL)
        @JoinTable(
            name = "USER_FARM",
            joinColumns = @JoinColumn(name = "r_user_id", referencedColumnName = "id"),
            inverseJoinColumns = @JoinColumn(name = "r_farm_id", referencedColumnName = "id"))
        private List<User> users;
      

      【讨论】:

        猜你喜欢
        • 2013-09-06
        • 2013-06-11
        • 1970-01-01
        • 1970-01-01
        • 2017-11-17
        • 2011-07-29
        • 2012-06-08
        • 2020-03-26
        • 2013-06-22
        相关资源
        最近更新 更多