在Hibernate 5,您可以定义查询提示使用org.hibernate.query.Query.html#addQueryHint基础数据库。正在使用的SQL方言负责注入与查询中定义的每个提示相关的适当文本。
不幸的是,如果您阅读org.hibernate.dialect.MySQLDialect的来源,您会注意到它不会扩展方法org.hibernate.dialect.Dialect#getQueryHintString,并且默认情况下它什么也不做。
你可以尝试寻找实现数据库查询暗示关于索引,或者,如果你愿意让你的手脏一些替代MySQL的话,你可以扩展MySQL的方言之一,自己做:
public class MySqlExtendedDialect extends MySQLDialect {
public String getQueryHintString(String query, List<String> hints) {
/** define a format and read the hints, then patch the query appropriately **/
String modifiedQuery = query;
return modifiedQuery;
}
}
例如,您可以在查询中定义一个类似“USE_INDEX_COL1_COL2”的提示。然后当你的方言找到“USE_INDEX_ *”提示时,它需要做一些基本的SQL解析并在正确的位置注入正确的文本。
纯粹的乐趣!
99.9%的查询不需要提示。我们可以看到麻烦的SQL和'SHOW CREATE TABLE'。索引合并交集可以通过添加_composite_index来改进。 (呃,总是我见过。) –