【问题标题】:JPA HQL query with where condition on FK columsJPA HQL 查询在 DF 列上具有 where 条件
【发布时间】:2013-07-04 07:04:17
【问题描述】:

我有 2 个具有单对多关系的实体:

@Entity
public class Project {

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private long id;


@OneToMany(mappedBy="project",cascade=CascadeType.ALL)
private java.util.List<RmtService> services = new ArrayList<RmtService>();

}

和:

@javax.persistence.Entity
public class Service implements Serializable{

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private long id;

@ManyToOne
    @JoinColumn(name = "project_id")
private Project project;

    // . . .
 }  

有一种方法可以执行 JPA 查询,生成如下 SQL 查询:

select * from service where project_id=?

??

我尝试过的所有查询都会在 Project 表上生成一个联接。

我试过了:

select s from Service s left join fetch s.project pp where pp.id = :id 

生成

select rmtservice0_.id as id1_1_0_, project1_.id as id1_0_1_, 
rmtservice0_.project_id as project3_1_0_, rmtservice0_.serviceType 
as serviceT2_1_0_, project1_.name as name2_0_1_, project1_.surname
as surname3_0_1_ from RmtService rmtservice0_ 
left outer join Project project1_ on rmtservice0_.project_id=project1_.id 
where   project1_.id=? 

select s from RmtService s where s.project.id = :id

生成 2 个查询:

select rmtservice0_.id as id1_1_, rmtservice0_.project_id as project3_1_, 
rmtservice0_.serviceType as serviceT2_1_ from RmtService rmtservice0_ where 
rmtservice0_.project_id=?

select project0_.id as id1_0_0_, project0_.name as name2_0_0_, project0_.surname
as surname3_0_0_ from Project project0_ where project0_.id=?

非常感谢

【问题讨论】:

  • 你尝试过哪些查询?
  • 在问题中更改了内联

标签: hibernate jpa hql


【解决方案1】:
SELECT s FROM Service s
WHERE s.project = :project

【讨论】:

  • 非常感谢!实际上,即使这个版本也触发了 2 个查询,因为我没有强制 @ManyToOne 变得懒惰,当我将其更改为懒惰时,它工作正常。
  • 我确实认为可能是这样。很高兴我能提供帮助。
猜你喜欢
  • 1970-01-01
  • 2012-05-21
  • 1970-01-01
  • 1970-01-01
  • 2018-08-14
  • 1970-01-01
  • 1970-01-01
  • 2019-07-20
  • 2013-10-11
相关资源
最近更新 更多