Java 결과 결과가 있는지 확인하는 방법


311

결과 집합 에는 hasNext에 대한 방법이 없습니다. resultSet에 값이 있는지 확인하고 싶습니다

이것이 올바른 방법입니까?

if (!resultSet.next() ) {
    System.out.println("no data");
} 

2
나 같은 미래의 독자들을 위해 : Felype와 Dermot Doherty의 답변이 도움이되었습니다
Benj

답변:


237

맞습니다. 처음에 ResultSet커서가 첫 번째 행을 가리키고 있습니다. 첫 번째 호출이 next()반환 되면에 false데이터가없는 경우 ResultSet입니다.

이 방법을 사용하면 전화해야 할 수도 있습니다 beforeFirst() 지금 첫 번째 행을 지나서 위치했기 때문에 재설정 후 즉시 .

그러나 아래 Seifer의 답변 은이 질문에 대한보다 우아한 해결책 이라는 점에 유의해야합니다 .


37
그러나 / are / 행이 있으면 테스트 후에 첫 번째 행을 가리키게됩니다. 따라서 실수로 행을 건너 뛰지 않도록하십시오.
Matthew Flaschen

1
커서 (포인터)가 첫 번째 행을 가리키는 좋은 점
JohnMerlino

@MatthewFlaschen, 맞습니다. 첫 번째 줄을 건너 뛰는 문제를 해결하려면 do {...}를 사용했습니다. while (rs.next);
이스라엘 사람

8
isBeforeFirst()커서를 진행시키지 않고 리턴 된 행이 있는지 테스트하기 위해 호출 한 다음 정상적으로 진행할 수도 있습니다.
SnakeDoc

528

ResultSet커서가 첫 번째 행 앞을 가리키는 새로 반환 된 것으로 작업한다고 가정하면 더 쉽게 확인할 수 있습니다 isBeforeFirst(). 이렇게하면 데이터를 읽을 경우 역 추적 할 필요가 없습니다.

문서에서 설명한대로 커서가 첫 번째 레코드 앞에 있지 않거나 ResultSet에 행이없는 경우 false를 리턴합니다 .

if (!resultSet.isBeforeFirst() ) {    
    System.out.println("No data"); 
} 

 


15
고마워요, 예, 알고 있지만 같은 문제가 발생하여 앞으로 확인하고 뒤로 읽으면서 읽는 것에 만족하지 않았습니다. 이 간단한 솔루션은 같은 상황에있는 다른 사람들에게도 도움이 될 것이라고 생각했습니다.
Seifer

5
최소한 DB2의 경우 결과 세트는 "스크롤 가능"유형이어야합니다. 실행할 명령문을 작성할 때 설정할 수 있습니다.
Laurence Dougal Myers

1
아래의 Felype의 답변 이 더 완전합니다
Tom Howard

Oracle 문서 : 참고 : isBeforeFirst 메소드 지원은 결과 세트 유형이 TYPE_FORWARD_ONLY
emi-le

52

항상 다음 단계를 수행하고 포스트 루프 검사를 수행 할 수 있습니다.

if (!resultSet.next() ) {
    System.out.println("no data");
} else {

    do {
     //statement(s)
    } while (resultSet.next());
}

21

일반적으로 다음과 같은 작업을 수행합니다.

while ( resultSet.next() ) { 
   // Read the next item
   resultSet.getString("columnName");
}

빈 세트를보고하려면 읽은 항목을 세는 변수를 추가하십시오. 단일 항목 만 읽으면 코드가 적합합니다.


16

커서 위치에 관계없이 결과 집합이 비어 있는지 또는 완전히 비어 있는지 확인하려면 다음과 같이하십시오.

public static boolean isMyResultSetEmpty(ResultSet rs) throws SQLException {
    return (!rs.isBeforeFirst() && rs.getRow() == 0);
}

이 함수는 ResultSet가 비어 있으면 true를, 그렇지 않으면 false를 반환하거나 ResultSet이 닫히거나 초기화되지 않은 경우 SQLException을 발생시킵니다.


12

이를 위해 do {...} while () 구문과 함께 ResultSet.next ()를 사용하는 것이 가장 좋습니다.

"결과 확인"호출 ResultSet.next ()는 커서를 첫 번째 행으로 이동하므로 do {...} while () 구문을 사용하여 해당 행을 처리하고 루프에서 리턴 된 나머지 행을 계속 처리하십시오.

이렇게하면 결과를 확인하면서 동시에 반환 된 결과를 처리 할 수 ​​있습니다.

if(resultSet.next()) { // Checks for any results and moves cursor to first row,
    do { // Use 'do...while' to process the first row, while continuing to process remaining rows

    } while (resultSet.next());
}

8

가장 실용적인 대답에 따르면 "isBeforeFirst ()"를 사용하는 것이 좋습니다. "forward only type"이 없으면 최상의 솔루션이 아닙니다 .

" .first () 라는 메소드가 있습니다. " . 똑같은 결과를 얻는 것은 덜 과잉입니다. "결과"에 무언가가 있는지 확인하고 커서를 움직이지 않습니다.

설명서에는 " 결과 세트에 행없으면 "(...) false "라고 표시되어 있습니다.

if(rs.first()){
    //do stuff      
}

isBeforeFirst ()를 호출하여 커서를 진행하지 않고 리턴 된 행이 있는지 테스트 한 후 정상적으로 진행할 수 있습니다. – SnakeDoc 9 월 2 일 14시 19:00

그러나 "isBeforeFirst ()"와 "first ()"에는 차이가 있습니다. "forward only"유형의 결과 집합에서 수행 된 경우 먼저 예외를 생성합니다.

두 개의 던지기 섹션을 비교하십시오. http://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html#isBeforeFirst () http://docs.oracle.com/javase/7/docs /api/java/sql/ResultSet.html#first ()

기본적으로 이것은 "앞으로 만"유형이있는 한 "isBeforeFirst"를 사용해야한다는 것을 의미합니다. 그렇지 않으면 "first ()"를 사용하는 것이 덜 과도합니다.


1
똑같은 결과를 얻는 것이 어떻게 "과도하게 적은"것입니까? first ()의 목적은 커서가 아직 없으면 첫 번째 행으로 커서를 옮기는 것입니다 (성공하면 true를 반환). isBeforeFirst는 순전히 진단 기능 일 뿐이며 저자의 목적에 더 적합한 것으로 보입니다. 또한 first ()의 표현 방식은 "유효한 행에"있는 한 true를 반환합니다. "첫 번째 행에"라고 표시되는 것만 큼 이상합니다. 나에게 커서가 진보하지 않고 처음으로 다시 가져오고 싶지 않다면이 시나리오에서 first ()를 사용하는 이점을 보지 못했습니다.
Jon

5

결과 세트에 행이 있는지 확인하려는 경우 작동합니다.

참고 next() 다음 행으로 항상 이동, 그래서 당신이 결과에서 어떤 읽는 일을 계획하는 경우에 당신의 계정에 그를 취할 필요가 설정합니다.

ResultSet의 일반적인 사용법 (간단히 읽는 경우)은 다음과 같습니다.

while (resultSet.next())
{
   ... read from the row here ...
}

next()결과 세트가 비어 있는지 확인하기 위해 이미 한 번 호출 한 경우 분명히 올바르게 작동하지 않으므로 조심하십시오. "백업"방법이 있지만 모든 유형의 결과 집합에 대해 지원되는 것은 아닙니다.


5

이것은 제가 실용적이고 읽기 쉬운 부분입니다.

        if (res.next()) {
            do {

                // successfully in. do the right things.

            } while (res.next());
        } else {
           // no results back. warn the user.
        }

2
if (!resultSet.isAfterLast() ) {    
System.out.println("No data"); 
} 

isAfterLast() 빈 결과 집합에 대해서도 false를 반환하지만 커서가 첫 번째 행 앞에 있기 때문에이 방법이 더 분명한 것 같습니다.


2
if(resultSet.first) {

} else { 
    system.out.println("No raw or resultSet is empty");
}

ResultSet에 raw가 없으면 resultSet.firstfalse 를 리턴하기 때문입니다.


그러나 커서를 불필요하게 첫 번째 행으로 이동하고 ob "재설정"개체의 추가 사용을 혼동 할 수 있으며 데이터가 손실 될 수 있습니다.
Tigran Babajanyan

이것은 더 좋아 보이지만 앞으로 커서 결과 집합에서는 작동하지 않습니다.
eliteproxy

1

가장 좋은 방법은 첫 번째 행을 확인하여 데이터를 가져올 때 행을 건너 뛰는 실수를 피할 수 있도록하는 것입니다. 다음과 같습니다. if (! resultSet.first ()) {System.out.println ( "no data"); }


1

resultSet.next ()를 사용하면 resultSet에 값이 포함되어 있는지 여부에 관계없이 결과를 쉽게 얻을 수 있습니다.

ResultSet resultSet = preparedStatement.executeQuery();
if(resultSet.next())
 //resultSet contain some values
else
 // empty resultSet

기존 답변을 반복하지 마십시오.
james.garriss

1
ResultSet result = stmt.executeQuery(sqlQuery);
if (!result.next())
    status = "ERROR";
else
    status = "SUCCESS";

1

현재 행을 첫 번째 인덱스 (기본 키 처리)로 설정하려고했습니다. 내가 제안 할게

if(rs.absolute(1)){
    System.out.println("We have data");
} else {
    System.out.println("No data");
}

ResultSet이 채워지면 첫 번째 행 앞을 가리 킵니다. 첫 번째 행 (로 표시 rs.absolute(1))으로 설정하면 행 1에 성공적으로 배치 되었음을 나타내는 true를 반환하거나 행이 없으면 false를 반환합니다. 이것을 외삽 할 수 있습니다

for(int i=1; rs.absolute(i); i++){
    //Code
}

현재 행을 위치 i로 설정하고 행이 존재하지 않으면 실패합니다. 이것은 단지 다른 방법입니다

while(rs.next()){
    //Code
}

당신의 대답은 무엇인가?
CMedina April

1

ResultSet이 비어 있는지 확인하기 위해 다음 메소드를 작성했습니다.

public static boolean resultSetIsEmpty(ResultSet rs){        
    try {
        // We point the last row
        rs.last();
        int rsRows=rs.getRow(); // get last row number

        if (rsRows == 0) {
            return true;
        }

        // It is necessary to back to top the pointer, so we can see all rows in our ResultSet object.
        rs.beforeFirst();
        return false;
    }catch(SQLException ex){            
        return true;
    }
}

다음 사항을 고려해야합니다.

CallableStatement 객체는 ResultSet 객체가 끝에서 맨 위로 돌아가도록 설정해야합니다.

TYPE_SCROLL_SENSITIVE : ResultSet 객체가 끝에서 이동하여 맨 위로 이동할 수 있습니다. 또한 마지막 변경 사항을 파악할 수 있습니다.

CONCUR_READ_ONLY : ResultSet 오브젝트 데이터를 읽을 수 있지만 업데이트 할 수 없습니다.

CallableStatement proc = dbconex.prepareCall(select, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);

1

결과 집합을 확인하는 가장 쉬운 방법은 org.apache.commons.collections.CollectionUtils 패키지의 CollectionUtils 를 사용하는 것입니다.

if(CollectionUtils.isNotEmpty(resultList)){
  /**
  * do some stuff
  */
}

빈 결과 집합 조건뿐만 아니라 null도 검사합니다.

자세한 내용은 다음 문서를 참조하십시오. 컬렉션 유틸리티


1
ResultSet이 컬렉션이 아닙니다.
Joachim Lous

1

왜 rs.getRow ()를 사용하지 않습니까?

int getRow()
           throws SQLException
Retrieves the current row number. The first row is number 1, the second number 2, and so on.
Note:Support for the getRow method is optional for ResultSets with a result set type of TYPE_FORWARD_ONLY

Returns:
the current row number; 0 if there is no current row
Throws:
SQLException - if a database access error occurs or this method is called on a closed result set
SQLFeatureNotSupportedException - if the JDBC driver does not support this method
Since:
1.2

나를 위해 "if (rs.getRow ()! = 0)"을 확인하십시오.


0

당신은 이런 식으로 할 수 있습니다

boolean found = false;

while ( resultSet.next() )
{
    found = true;
    resultSet.getString("column_name");
}

if (!found)
    System.out.println("No Data");

1
WAAAY가 너무 복잡합니다.
jordaniac89

0
ResultSet rs = rs.executeQuery();
if(rs.next())
{
  rs = rs.executeQuery();
  while(rs.next())
  {
    //do code part
  }
}
else
{
  //else if no result set
}

if(rs.next()){....}ResultSet의 첫 번째 행을 호출 하면 실행되고 while(rs.next()){....}그 다음에 다음 행에서 결과를 얻으 므로 쿼리를 다시 실행하는 것이 좋습니다 . 따라서 쿼리를 다시 실행 if하는 것이 더 나은 옵션 이라고 생각 합니다.


5
-1 더 나은 옵션이 아닙니다. 왜 데이터베이스를 두 번 쿼리합니까? 통화간에 데이터가 크게 변경되면 어떻게됩니까? 이것은 낭비입니다.
Toby Caulk

-2

처음에 결과 집합 개체 (rs)는 BFR (첫 번째 레코드 이전)을 가리 킵니다. rs.next ()를 사용하면 커서가 첫 번째 레코드를 가리키고 rs는 "true"를 유지합니다. while 루프를 사용하면 테이블의 모든 레코드를 인쇄 할 수 있습니다. 모든 레코드가 검색된 후 커서는 ALR (마지막 레코드 후)로 이동하고 널로 설정됩니다. 테이블에 2 개의 레코드가 있다고 생각합시다.

if(rs.next()==false){
    // there are no records found
    }    

while (rs.next()==true){
    // print all the records of the table
    }

간단히 말해서 조건을 while (rs.next ())와 같이 쓸 수도 있습니다.


3
while 루프는 반환 된 첫 번째 행에서 작동 할 기회를 얻지 못합니다.이 접근법에는 다소 치명적인 결함이 있습니다. 위의 제안보다이 제안보다 낫습니다.
Jules
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.