【发布时间】:2018-11-18 10:09:06
【问题描述】:
我在这里遇到了一个小问题,查询一个字符串以在数据库中搜索自动完成功能,我得到的问题是我需要首先结果是所有“开始”的语句,然后是包含该功能的语句字符串!
例如:如果我在数据库的一个表中得到以下记录:
- 提供很棒的服务
- 这里有别的东西
- 额外服务
- 我的服务很棒
- 提供服务
- 动物园服务
我开始输入“服务”,我需要先显示第 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;
}
}
【问题讨论】:
标签: java playframework ebean