gpt4 book ai didi

java - 使用 JPA Criteria-API 从连接表中选择对象

转载 作者:搜寻专家 更新时间:2023-11-01 01:28:35 24 4
gpt4 key购买 nike

我为以下问题奋斗了大约两天,希望您能插入我朝着正确的方向前进。我在研究过程中发现的教程和示例始终只展示了如何在条件 api 中轻松加入工作。首先我有两个类:

@Entity
public class Offer {

private String name;
@ManyToOne private Location location;
private String tags;
}

@Entity
public class Location {
private String name;
private string tags;
}

因为我需要避免循环引用,所以这些类之间的连接只是单向的。这个类中有很多附加属性,我想根据我的搜索过滤器构建动态查询。以下 SQL 语句将解释我喜欢做什么:

SELECT l 
FROM Offer o
JOIN o.location l
WHERE o.tags LIKE :sometag AND l.tags LIKE :someothertag

在使用标准 api 实现后,我得到了这段代码:

CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
CriteriaQuery<Location> criteriaQuery = criteriaBuilder.createQuery(Location.class);
criteriaQuery = criteriaQuery.distinct(true);
Join location;
ArrayList<Predicate> whereList = new ArrayList<Predicate>();

// if filter by offer, use offer as main table and join location table
if (filter.getOfferTags() != null) {
Root<Offer> offer = criteriaQuery.from(Offer.class);

location = offer.join("location");


// limit to offering tags
Path<String> tagPath = offer.get("tags");

for (String tag : filter.getOfferTags()) {
Predicate whereTag = criteriaBuilder.like(tagPath, "%" + tag + "%");
whereList.add(whereTag);
}

} else {
// else use location table as base
location = (Join<Location, Location>) criteriaQuery.from(Location.class);
}

但如果我执行此操作,我会从我的 H2 数据库中收到以下错误消息:

Column "LOCATION.ID" not found; SQL statement: 
SELECT DISTINCT LOCATION.ID, LOCATION.NAME
FROM OFFER t0, LOCATION t1
WHERE t0.TAGS LIKE ? AND t1.TAGS LIKE ?

数据库希望 select 子句中有 t1.IDt1.NAME 而不是 LOCATION.IDLOCATION.NAME 。我怎样才能告诉 JPA 创建“正确的”请求?我的代码中是否遗漏了什么?

我正在使用带有 Eclipse Link 和 H2 数据库的 Glassfish 3.1.1。

最佳答案

我认为您只是错过了查询中的一个选择:

criteriaQuery.select(location);

关于java - 使用 JPA Criteria-API 从连接表中选择对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9329002/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com