gpt4 book ai didi

java - 使用 FIND_IN_SET 的 Hibernate 标准

转载 作者:行者123 更新时间:2023-11-29 15:42:35 25 4
gpt4 key购买 nike

我的项目有以下要求:
(1) 向 API 请求对象,该对象不属于(字符串)列表类型。
(2) 我们使用 Hibernate Criteria 从 mysql 数据库获取结果集。
(3) 其中一列具有管道分隔值。
(4) 我们必须根据请求对象的每个值获取行。

Table: user_info  
-----------------------------------------------------------
user_id user_name .. .. .. .. hobbies
-----------------------------------------------------------
101 johnSmith .. .. .. .. Traveling|Painting|Gardening
102 tomWatch .. .. .. .. Gardening|Reading|Fishing
103 robertPatt .. .. .. .. Dancing|Gardening|Swimming|Blogging
104 julieAdams .. .. .. .. Bicycling|Fishing|Socializing

JSON Request object:
{
searchParams : {
hobbies : [
"Gardening",
"Fishing",
"Reading"
],
..
..
..
}
}


Java Code


if(!CollectionUtils.isEmpty(searchParams.getHobbies())) {
List<String> reqHobbies = searchParameters.getHobbies();
Disjunction disjunction = Restrictions.disjunction();
for(String hobby : reqHobbies) {
Criterion criterion = Restrictions.like("hobbies", "|" + hobby + "|");
disjunction.add(criterion);
}
criteria.add(disjunction);
}

此查询将不起作用,因为值(来自表)的开头没有“|”符号..

如果我修改 Critieria API 以按以下方式生成查询,

select * from user_info
where hobbies like '%Gardening|%' or hobbies like '%Fishing|%' or hobbies like '%Reading|%'
or hobbies like '%|Gardening|%' or hobbies like '%|Fishing|%' or hobbies like '%|Reading|%'
or hobbies like '%|Gardening%' or hobbies like '%|Fishing%' or hobbies like '%|Reading%';

这个设计也有一个缺陷。解决这个问题的唯一方法是使用FIND_IN_SET。

Mysql查询:

select * from user_info 
where hobbies find_in_set('Gardening', replace(hobbies, '|', ','))
or hobbies find_in_set('Fishing', replace(hobbies, '|', ','))
or hobbies find_in_set('Reading', replace(hobbies, '|', ','));

如何使用 Hibernate Criteria 创建 find_in_set 查询?使用@Formula?

最佳答案

如果您的目标是构建 query dynamically并且不使用 Criteria API,您可以使用 FluentJPA 构建它,就像这样:

public List<UserInfo> filterByHobbies(List<String> hobbies) {

Function1<UserInfo, Boolean> dynamicFilter = buildOr(hobbies);

FluentQuery query = FluentJPA.SQL((UserInfo user) -> {
SELECT(user);
FROM(user);

WHERE(dynamicFilter.apply(hobbies);
});

return query.createQuery(getEntityManager(), UserInfo.class).getResultList();
}

private Function1<UserInfo, Boolean> buildOr(List<String> hobbies) {
Function1<UserInfo, Boolean> criteria = Function1.FALSE();

for (String hobby : hobbies)
criteria = criteria.or(u -> FIND_IN_SET(parameter(hobby),
u.getHobbies().replace('|', ',')) > 0);

return criteria;
}

关于java - 使用 FIND_IN_SET 的 Hibernate 标准,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57446747/

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