当前位置: 首页 > 知识库问答 >
问题:

无法使用 Spring Data JPA 创建 JOIN

扈韬
2023-03-14

我是Spring Data的新手,并试图通过关注这篇关于SO和其他一些教程的帖子来解决这个问题,但没有取得太大成功。

我正在尝试在 2 个表之间使用 Spring Data JPA 进行简单的连接。数据库中的表称为: * user_vehicle -

user_vehicle表中数据库中的当前数据:
ID|vehicle_ID|user_ID
1|1|1
2|2|1

这是我尝试过但无法让它工作的代码(getter 和 setter 从帖子中删除以缩短它):

@Entity(name = "vehicle_model")
public class VehicleModel {

@Id
@Min(1)
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private Long manufacturerId;
private String title;
private int ccm;
private int kw;
private int yearOfManufacture;
private int engineTypeId;
private boolean isActive;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "vehicle_id", insertable = false, updatable = false)
@Fetch(FetchMode.JOIN)
private UserVehicle userVehicle;
}


@Entity(name = "user_vehicle")
public class UserVehicle {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@Column(nullable = false)
private long vehicleId;
@Column(nullable = false)
private long userId;

@OneToMany(targetEntity = VehicleModel.class, mappedBy = "userVehicle", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
List<VehicleModel> vehicleModels;
}


@Repository
public interface UserVehicleRepository extends CrudRepository<UserVehicle, Long> 
{
    Iterable<UserVehicle> findVehicleModelsByUserId(Long userId);
}

我希望在填充vehicle_model数据的可迭代中得到2个结果。相反,我得到了2个结果,但是对于车辆模型属性,我得到了“无法计算表达式方法抛出的'org.hibernate.exception.SQLGramar异常'异常”

以下是控制台的输出:

共有2个答案

龙俊良
2023-03-14

这是执行我有意想要的操作的解决方案 - 根据user_vehicle表中的user_id搜索车辆:

@Entity(name = "user_vehicle")
public class UserVehicle {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private long id;
  private boolean isActive;
  private long userId;

  @ManyToOne
  @JoinColumn(name = "vehicle_id")
  private Vehicle vehicle;


@Entity(name = "vehicle_model")
public class Vehicle {

  @Id
  @Min(1)
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;
  private Long manufacturerId;
  private String title;
  private int ccm;
  private int kw;
  private int yearOfManufacture;
  private int engineTypeId;
  private boolean isActive;

  @OneToMany(mappedBy = "vehicle")
  private Set<UserVehicle> userVehicles;


@Repository
public interface UserVehicleRepository extends CrudRepository<UserVehicle, Long> {

  Iterable<UserVehicle> findVehicleModelsByUserId(Long userId);

User类实际上根本没有使用:

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

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;
  private String username;
  private String password;
  private String firstName;
  private String lastName;
  private boolean isActive;

现在这是一种一对一的关系,并且正在做我第一次真正想要的事情。

希望它能帮助某人

淳于升
2023-03-14

在这里找到了解决方案:https://www.baeldung.com/jpa-many-to-many

我一直在寻找它有点错误,因为这是一个多对多的关系。我的想法是转到“中间”表,选择所有vehicle_iduserId=: id和从vehicle_ids列表中获取每辆车的详细信息。

以下是有效的正确实现:

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

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String username;
private String password;
private String firstName;
private String lastName;
private boolean isActive;

@OneToMany(mappedBy = "user")
private Set<UserVehicle> userVehicles;

@Entity(name = "user_vehicle")
public class UserVehicle {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private boolean isActive;

@ManyToOne
@JoinColumn(name = "vehicle_id")
private Vehicle vehicle;

@ManyToOne
@JoinColumn(name = "user_id")
private User user;


@Entity(name = "vehicle_model")
public class Vehicle {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private Long manufacturerId;
private String title;
private int ccm;
private int kw;
private int yearOfManufacture;
private int engineTypeId;
private boolean isActive;

@OneToMany(mappedBy = "vehicle")
private Set<UserVehicle> userVehicles;

最后,在存储库接口中我有一个这样的方法:

public interface UserVehicleRepository extends CrudRepository<UserVehicle, Long> {

Iterable<UserVehicle> findVehicleModelsByUserId(Long userId);

输出是这样的:

[
    {
        "id": 2,
        "vehicle": {
            "id": 2,
            "manufacturerId": 1,
            "title": "Fazer FZ1S",
            "ccm": 998,
            "kw": 110,
            "yearOfManufacture": 2008,
            "engineTypeId": 1,
            "active": true
        },
        "user": {
            "id": 2,
            "username": "sfajkovic",
            "password": "33",
            "firstName": "Ivan",
            "lastName": "Fajkovic",
            "active": true
        },
        "active": true
    }
]

问题不在于我真的不希望结果中的用户对象,所以现在我需要弄清楚那个。之后,我将尝试映射车辆制造商类,以便在相同的响应中获取这些结果。

 类似资料:
  • 问题内容: 我无法在数据库(mySQL)中创建表,使用并尝试使用以下命令输入未来表的名称: 然后,在用户输入表名称之后,我尝试构造并调用该语句: 如果我尝试不输入名称就执行它(如常量字符串:“ CREATE TABLE newtable(…)”,但我需要输入名称),它将很好地工作。 问题答案: 阅读表名后,您将必须格式化字符串,例如: 然后创建像:

  • 您好,我收到以下错误: 这是我的例子ata.kt 我的界面改装 addsUser的函数

  • 运行时收到此错误。

  • 我正在尝试使用JPA生成表。但我不能创造它。代码中没有错误,但似乎存在配置错误。但我找不到它,我尝试了很多配置但没有发生。多谢. 这是: } pom.xml

  • 这边有个getMenuType、getMenuType1、getMenuType2三个方法引用,getMenuType1传入到queryWrapper中查询没问题,getMenuType和getMenuType2报错

  • 我在使用下面的支付方法 它让我错误地说-无法使用OAuth密钥创建支出。 使用以下URL连接到我的应用程序的用户: https://connect.stripe.com/oauth/authorize?response_type=code 如果我使用的是该帐户的直接密钥,那么它可以正常工作。所以唯一的问题是当我使用一个使用OAuth获得的密钥时 下面是我正在使用的一种方法https://strip