【问题标题】:JPA query equals between two propertiesJPA 查询等于两个属性之间
【发布时间】:2016-03-15 05:27:40
【问题描述】:

可以用 JPA 自定义查询比较两个属性吗?

注册.java:

@Entity
public class Registration implements Serializable {

@Id
@GeneratedValue(generator = "uuid")
private UUID uuid;

@ManyToOne(targetEntity=Entry.class)
private Entry entry;

@ManyToMany(targetEntity=Rate.class,fetch = FetchType.EAGER)
private List<Rate> rate;

@ManyToMany(fetch = FetchType.EAGER)
private List<Planning> planning;

}

Rate.java:

@Entity
public class Rate implements Serializable {

@Id
@GeneratedValue(generator = "uuid")
private UUID uuid;

@ManyToOne
private Activity activity;
}

Planning.java:

@Entity
public class Planning implements Serializable {

@Id
@GeneratedValue(generator = "uuid")
private UUID uuid;

@OneToOne
private Location location;

@OneToOne(fetch = FetchType.EAGER)
private Coach coach;

@OneToOne
private Activity activity;

我将只检索 rate.activity.id = planning.activity.id 类似的内容:

public interface RegistrationDao extends CrudRepository<Registration, UUID> {

    findByPlanningAndRateActivityEqualsPlanningActivityOrderByEntryLastnameAsc(Planning planning);

 }

谢谢

【问题讨论】:

  • JPQL 允许比较 JPA 实体的许多字段。您在不是 JPA 实体模型中呈现的“模型”。
  • 当然是为了简化。
  • 那么你的问题是什么?如何以特定的方式形成 JPQL 查询(因为所有 JPA 教程都涵盖了这一点),或者您真的是关于 Spring Data JPA 的意思吗?
  • 我想做类似rates.activity.id = planning.activity.id的事情。 JPA关键词怎么办。当然findByPlanningAndRateActivityEqualsPlanningActivityOrderByEntryLastnameAsc 不起作用
  • 没有字段“rates”所以不知道这意味着什么。至于一些愚蠢的长方法名称,我猜这是 Spring-Data-JPA(因为没有人会使用他们自己选择的名称)......在这种情况下,也许你应该将问题标记为

标签: spring-boot spring-data spring-data-jpa


【解决方案1】:

您可以使用 JPA 查询,而不是使用长方法名称,它会是这样的。希望这会有所帮助。

@Query("select * FROM Registration REG,Entry E, Rate R,Planning P WHERE REG.id = :id and R.activity=P.activity ORDER BY E.lastname")

public List<Registration> <MethodName>(@Param("id") String registrationid);

【讨论】:

  • 最后,这就是我所做的。 SELECT p FROM Registration r JOIN r.planning p JOIN r.rate rt WHERE p.uuid = :planning AND p.activity=rt.activity group by r.entry.lastname, rt.type.id 。谢谢
【解决方案2】:

我已针对此解决方案进行了更改,但我认为这不是好方法(rateActivity 和 PlanningActivity 必须具有相同的 id)

public interface RegistrationDao extends CrudRepository<Registration, UUID> {

  Iterable<Registration> findByPlanningAndRateActivityEqualsAndPlanningActivityEqualsOrderByEntryLastnameAsc(Planning planning,Activity rateActivity,Activity planningActivity);

}

【讨论】:

    猜你喜欢
    • 2020-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-28
    • 2020-05-24
    • 1970-01-01
    • 1970-01-01
    • 2020-12-15
    相关资源
    最近更新 更多