【问题标题】:Putting SQL query in CrudRepository to limit columns (and further SQL queries after this)将 SQL 查询放入 CrudRepository 以限制列(以及此后的进一步 SQL 查询)
【发布时间】:2026-01-21 12:20:05
【问题描述】:

我正在开发一个记录用户请求响应的 Spring 应用程序(将其发送到数据库并检索它)。 获取记录代码是这样的(Controller):

/**
     * this method fetches all userrequest response records from user_request_response table
     * @return
     */
    @CrossOrigin(origins = "*")
    @GetMapping(path="/all")
    public @ResponseBody Iterable<UserRequestResponse> getAllRequestResponseRecords() {
        return userRequestResponseRepository.findAll();
    }

道码:

import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;

import com.abc.datacollection.entity.UserProjection;
import com.abc.datacollection.entity.UserRequestResponse;

public interface UserRequestResponseRepository extends CrudRepository<UserRequestResponse, Integer> {


public static final String FIND_QUERY = 
            "select new com.abc.datacollection.entity.UserRequestResponse(user.u_httpstatus ,user.u_queryparam) from UserRequestResponse user";
    @Query(value = FIND_QUERY)
    List<UserProjection> getAllRequestResponseRecords();

}

带有 getter 和 setter 的类:(删除了一些变量及其 getter 和 setter)

import java.sql.Date;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity // This tells Hibernate to make a table out of this class
public class UserRequestResponse {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)

    private String u_httpstatus;

    private String u_error_message;

    private String u_queryparam;


public UserRequestResponse(String u_httpstatus, String u_queryparam) {
        this.u_httpstatus = u_httpstatus;
        this.u_queryparam = u_queryparam;
    }
    public int getSys_id() {
        return sys_id;
    }
public String getU_httpstatus() {
            return u_httpstatus;
        }

        public void setU_httpstatus(String u_httpstatus) {
            this.u_httpstatus = u_httpstatus;
        }

        public String getU_error_message() {
            return u_error_message;
        }

        public void setU_error_message(String u_error_message) {
            this.u_error_message = u_error_message;
        }

        public String getU_queryparam() {
            return u_queryparam;
        }

        public void setU_queryparam(String u_queryparam) {
            this.u_queryparam = u_queryparam;
        }



    }

提取 u_queryparam 和 u_httpstatus 的投影:

public interface UserProjection {
    String getU_httpstatus();
    String getU_queryparam();

}

MySQL 查询示例(我试图在 CrudRepository 中的 java 代码中匹配的查询,InternSearchAnalytics.user_request_response 是表的名称):

select u_httpstatus, u_queryparam from InternSearchAnalytics.user_request_response

但是,当我运行 java 代码并点击生成的端点时,我得到了所有字段。有人可以帮我吗?我已经坚持了2天了。

【问题讨论】:

  • 您的行 :userRequestResponseRepository.findAll() 将从存储库中调用默认的 findAll,而不是您的查询。
  • 如果我理解正确,您每次检索记录时都会获得完整的 UserProjection 实体及其所有字段?
  • 是的。确实如此。我正在从数据库中获取所有字段。另外,我制作了投影(界面),因为我在某处读到它会有所帮助。

标签: java spring hibernate


【解决方案1】:

您可以使用 UserRequestResponse 类中的新构造函数从查询中获取选定字段,例如

public UserRequestResponse(String u_httpstatus, String u_queryparam) {
    this.u_httpstatus = u_httpstatus;
    this.u_queryparam = u_queryparam;
}

对于查询,您应该使用构造函数更改它

public static final String FIND_QUERY = 
                    "select new com.your.package.name.UserRequestResponse(user.u_httpstatus ,user.u_queryparam) from UserRequestResponse user";

有一点是您需要使用具有完全限定名称的构造函数。希望这会有所帮助。

【讨论】:

  • 嘿,我收到一个错误:java.lang.IllegalArgumentException:在 HTTP 协议中发现无效字符。我已经按照您所说的放置了构造函数并更改了查询字符串。你能告诉我我做错了什么吗?我正在使用您建议的编辑来编辑问题。
  • @ABHINAVSOOD 你能分享完整的堆栈跟踪吗?
  • nvm,我解决了这个错误。非常感谢。虽然我只成功地获得了必填字段而不是自定义 SQL 查询,例如基于分组的计数等。我将把这部分放在另一个问题中,并使用更新的代码。非常感谢!!
  • 另外,你能关注这个问题吗:*.com/questions/58215972/…。非常感谢。