java - JPA查询JOINED表
问题描述
这样做的目标是使用关键字进行搜索,并且应该选择或显示两个表。下面是在我的 sql 控制台上运行的示例查询。
SELECT * FROM Week_Cycle w JOIN Day d ON d.week_Cycle_ID = w.id WHERE w.logged_By LIKE 'samplename' OR d.user_ID LIKE 'samplename'
我能够选择数据,但是当我在我的域上将其转换为 NamedQuery 然后在我的应用程序上运行它时会引发 SQL 异常,如下所示:
javax.persistence.PersistenceException:异常 [EclipseLink-4002](Eclipse Persistence Services - 2.7.6.v20200131-b7c997804f):org.eclipse.persistence.exceptions.DatabaseException 内部异常:java.sql.SQLException:从池中借用 prepareStatement 失败
这是命名查询:
SELECT w FROM WeekCycle w JOIN Day d ON d.weekCycle = w.id WHERE w.loggedBy LIKE :keyword OR d.userId LIKE :keyword
这是 WeekCycle 域:
@Entity
@Table(name = "WEEK_CYCLE")
@NamedQueries({
@NamedQuery(name = WeekCycle.FIND_ALL_WEEK_CYCLES_BY_KEYWORD, query = "SELECT w FROM WeekCycle w JOIN Day d ON d.weekCycle = w.id WHERE w.loggedBy LIKE :keyword OR d.userId LIKE :keyword")})
public class WeekCycle{
public static final String FIND_ALL_WEEK_CYCLES_BY_KEYWORD = "FindAllWeekCyclesByKeyword";
@Id
@SequenceGenerator(name = "SEQ_WEEK_CYCLE", sequenceName = "SEQ_WEEK_CYCLE", allocationSize = 50, initialValue = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_WEEK_CYCLE")
@Column(nullable = false)
private long id;
@Column(name = "NAME", length = 255)
private String name;
@Enumerated(EnumType.STRING)
@Column(name = "STATUS", length = 40)
private WeekCycleStatus weekCycleStatus;
@Column(name = "LOGGED_BY", length = 128)
private String loggedBy;
@OrderBy("id ASC")
@OneToMany(fetch = FetchType.EAGER, mappedBy = "weekCycle", orphanRemoval = true, cascade = CascadeType.ALL)
private List<Day> days = new ArrayList<>();
这是 Day 域:
@Entity
@Table(name = "DAY")
public class Day {
@Id
@SequenceGenerator(name = "SEQ_Day", sequenceName = "SEQ_Day", allocationSize = 50, initialValue = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_Day")
@Column(nullable = false)
private long id;
@Basic
@Column(name = "USER_ID", nullable = true)
private String userId;
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "START_TIME")
private LocalDateTime startTime;
@Basic
@Column(name = "DATA_SOURCE", nullable = true)
private String dataSource;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "WEEK_CYCLE_ID")
private WeekCycle weekCycle;
道:
public List<WeekCycle> searchOnWeekCycles(String keyword) {
TypedQuery<WeekCycle> query = createEntityManager()
.createNamedQuery(WeekCycle.FIND_ALL_WEEK_CYCLES_BY_KEYWORD, WeekCycle.class);
query.setParameter("keyword", "%" + keyword + "%");
return query.getResultList();
}
是否有与上面的 namedQuery 等效的条件查询?
解决方案
推荐阅读
- reduce - 使用reduce的内积的意外结果
- ios - 更新iOS后,所有使用该框架的应用程序都停止在设备上运行,而是在模拟器上运行
- json - 试图根据 jq 查找日期
- javascript - 构建一个烧瓶 + heroku 应用程序,用于静态资产的 s3 托管(js 和图像当前未加载)
- c++ - 解释 for (char c : str) 是做什么的?
- java - 如何将 EBNF 重复实现为 Java 代码?
- php - 产品 (........ ) 结束了。PrestaShop 1.7
- swift - 为什么 SomeStruct() is AnyObject 返回 true?
- html - 引导选项卡无法访问 Vuejs
- spring - DirectMessageListenerContainer 和 SimpleMessageListenerContainer 与 Rabbit Channels 的关系