java - 开始的字符串的 Ebean 查询然后包含特定的字符串
问题描述
我在这里遇到了一个小问题,查询一个字符串以在数据库中搜索自动完成功能,我得到的问题是我需要首先结果是所有“开始”的语句,然后是包含该字符串的语句!
例如:如果我在数据库的一个表中得到以下记录:
- 提供很棒的服务
- 这里有别的东西
- 额外服务
- 我的服务很棒
- 提供的服务
- 动物园服务
我开始输入“服务”,我需要先显示 5,然后是其余项目(1、3、4、6)
我知道如何在 MySQL 中做到这一点,例如:
select * from `services` where `name` like '%Service%' order by `name` like 'Service%' desc;
或者可能像这里提到的方式:MySQL order by "best match"
但我需要在 Ebean 中这样做。我试过了:
return Service.find.query().where().icontains("name", search).findList()
但是这个返回 1, 3, 4, 5, 6,
现在我执行以下操作:
final List<Service> list = Service.find.query().where()
.istartsWith("name", search)
.orderBy("name").findList(); // First query
list.addAll(Service.find.query().where()
.icontains("name", search)
.not().istartsWith("name", search)
.orderBy("name").findList()); // Then add the results for the second query
return list;
这将完成这项工作,5、1、3、4、6,但我不喜欢它,因为我用 2 个查询访问数据库,我也确实在第二个查询中排除了复杂数据类型查询中的第一个查询,但无论如何,这是正确的方法吗?如果没有,您有更好的方法的建议或解决方案吗?
桌子:
CREATE TABLE `services` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
ALTER TABLE services ADD UNIQUE `uq_services_name`(name);
EBean实体 Service.java:
@Entity
@Table(name = "services")
public class Service extends BaseModel<Service> {
public static Finder<Integer, Service> find = new Finder<>(Service.class);
@Column(nullable = false, unique = true)
private String name;
// ... setters and getters
}
BaseModel.java:
@MappedSuperclass
public abstract class BaseModel<T> extends Model {
@Id
@Column
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
public final Integer getId() {
return id;
}
@SuppressWarnings("unchecked")
public final T setId(Integer id) {
this.id = id;
return (T) this;
}
}
解决方案
我相信问题是order by name like 'Service%' desc;
部分。
你可以只使用 findNative(sql)
最近对 Ebean 也进行了更改,以允许 order by 子句中的任意函数,因此您可以尝试更新您的 Ebean 版本并执行以下操作:
.orderBy("name like 'Service%' desc").findList();
推荐阅读
- reactjs - 有人可以解释 react-native-calendar 议程部分发生了什么吗?
- c++ - 如何在代码编译期间解决与加载共享库相关的错误?
- string - 如何替换颤振或飞镖中的第一个单词
- python - 根据提议的特征对玩家进行分类时存在错误
- mysql - 如何在这种情况下插入mysql?
- python - Python Pandas - 如何查找列值与两个数据框不同的行
- android - 在 Kotlin 中动态添加视图的问题
- selenium-chromedriver - Chrome 无法在 GitHub Actions 中启动
- excel - 使用来自 excel 表的用户输入过滤数据透视表中的行
- c++ - 在 C++ 中实现卡尔曼滤波器