有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

一对多关系的java JPQL

我试图为一对多关系创建一个JPQL,即用户和设备,因为一个用户可以拥有一对多设备。我想找到设备的整个对象,如果它是由用户拥有的,并且设备名称是正确的

如果是SQL查询,那么我只能对设备执行以下查询:

select * from DEVICE where USER_ID = 2 and DEVICENAME = "mypc";

其中USER_ID是设备表中的外键。但是如何对用户和设备表执行JPQL查询呢?以下是用户和设备类的一些信息

@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.TABLE)
public int id;
public String username;
public String firstname;
public String lastname;
public String hashPassword;

@OneToMany(mappedBy = "user")
public List<Device> devices = new ArrayList<Device>();


}

@Entity
public class Device {

    @Id
    @GeneratedValue(strategy = GenerationType.TABLE)
    public int id;
    public String deviceName;
    @ManyToOne
    public User user;
    String deviceOS;
    String deviceType;
    String attributes;
    boolean standard;
}

共 (2) 个答案

  1. # 1 楼答案

    示例JPA查询:Documention

    Query query = entityManager.createQuery("SELECT di FROM Device di JOIN di.user u WHERE u.id=:userId and di.deviceName=:deviceName");
    query.setParameter("userId",userId );
    query.setParameter("deviceName",deviceName);
    List<Device> result = query.getResultList();
    
  2. # 2 楼答案

    您可以在查询中使用JPQL path expressions从一个实体导航到另一个实体,或者引用实体的属性

    更具体地说,路径表达式可用于沿@ManyToOne@OneToOne关系导航,例如:

    SELECT d FROM Device d WHERE d.user.id = :userId AND d.deviceName = :deviceName
    

    这里,d.user.id是一个路径表达式

    有关JPQL的一般概述,请看一下伟大的Wikibooks article