Java 如何将动态对象查询更改为criteria builder或更好的性能

Java 如何将动态对象查询更改为criteria builder或更好的性能,java,spring,performance,hibernate-criteria,Java,Spring,Performance,Hibernate Criteria,您好,我编写了一个连接查询,但在我的实体上没有关系注释。我喜欢更改查询以获得更好的性能。还有别的办法吗 @Override public List<Object[]> search(String code, String name, String username, String shopName, String startDate, String endDate) { Query query = null; StringJoiner stringJoiner = n

您好,我编写了一个连接查询,但在我的实体上没有关系注释。我喜欢更改查询以获得更好的性能。还有别的办法吗

@Override
public List<Object[]> search(String code, String name, String username, String shopName, String startDate, String endDate) {
    Query query = null;
    StringJoiner stringJoiner = new StringJoiner(" AND ");
    stringJoiner.add("SELECT sthLogin.sthId, sth.sthMobileNumber, sth.createdDate, sth.expiryDate, sth.brandingName, sth.shopName" +
            " FROM tbl_sth_login_credentials sth INNER JOIN tbl_maintain_sth_profile sth ON sth.Id = sth.sthPrimaryId WHERE sth.deletionStatus = 'N' ");

    if(StringUtils.isNotEmpty(sthCode))
        stringJoiner.add("stlogin.code = '" + sthCode + "'");

    if(StringUtils.isNotEmpty(sthName))
        stringJoiner.add("sth.brandingName = '" + sthName + "'");

    if(StringUtils.isNotEmpty(username))
        stringJoiner.add("sthLogin.sthMobileNumber = '" + username + "'");

    if(StringUtils.isNotEmpty(shopName))
        stringJoiner.add("sth.shopName = '" + shopName + "'");


    if(StringUtils.isNotEmpty(shopName) && StringUtils.isNotEmpty(endDate))
        stringJoiner.add("sth.createdDate BETWEEN '" + startDate + "' AND '" + endDate + "' ");

    query = entityManager.createNativeQuery(stringJoiner.toString());
    return query.getResultList();
@覆盖
公共列表搜索(字符串代码、字符串名称、字符串用户名、字符串shopName、字符串startDate、字符串endDate){
Query=null;
细木工细木工=新细木工(“和”);
添加(“选择sthLogin.sthId、sth.sthMobileNumber、sth.createdDate、sth.expiryDate、sth.brandingName、sth.shopName”+
“从tbl\u sth\u登录\u凭证sth内部加入tbl\u维护\u sth\u在sth.Id=sth.sthPrimaryId上配置sth,其中sth.deletionStatus='N'”;
if(StringUtils.isNotEmpty(sthCode))
stringJoiner.add(“stlogin.code=”+sthCode+”);
if(StringUtils.isNotEmpty(sthName))
添加(“某物品牌名=”+sthName+”);
if(StringUtils.isNotEmpty(用户名))
添加(“sthLogin.sthMobileNumber=”“+username+””);
if(StringUtils.isNotEmpty(shopName))
添加(“sth.shopName=”“+shopName+””);
if(StringUtils.isNotEmpty(shopName)和&StringUtils.isNotEmpty(endDate))
添加(“在“+startDate+”和“+endDate+”之间创建的数据段”);
query=entityManager.createNativeQuery(stringJoiner.toString());
返回query.getResultList();

在sql编辑器中执行它,并对查询运行解释计划(取决于您的数据库如何执行),然后查看哪些部分需要很长时间,并开始优化(如添加适当的索引),很难看出有什么进展缓慢,或者单从这一点上看如何提高性能。实际上,我喜欢根据criteria builder更改代码。但正如我在主题中提到的,我没有映射注释。如何才能做到这一点。感谢您的回复Don’不要使用字符串生成器操作SQL,如果ShopName将包含奇怪的字符怎么办?请看PreParedStatementAPI