2016-12-09 2 views
0

CrudRepository 인터페이스에 커스텀 메소드를 추가 할 수 있습니까? 그렇다면 어떻게 할 수 있습니까?Spring Hibernate - FindByObject CrudRepository

다음 클래스에는 Foobar라는 엔티티 클래스가 있습니다. 이 질문을 위해 엔티티 클래스는 필드/열을 원하는 수만큼 가질 수 있습니다.

package com.bar 
import org.springframework.data.repository.CrudRepository; 
import com.bar.Foobar 
public interface FoobarCrudRepo extends CrudRepository<Foobar, Long> { 
    public Foobar findByObject(Foobar JObj); 
} 

이 코드는 사용자 지정 메서드를 제거하면 제대로 작동하지만 위와 같이 추가하면 오류가 발생합니다. 이 게시물 (Update or SaveorUpdate in CRUDRespository, Is there any options available)에서 내 이해는 인터페이스에 추가 메소드를 추가해야한다는 것이었고 (예에서와 같이) JPARepo가 나머지를 처리합니다. 그러나 아래 오류가 나타납니다. 내 생각 -이 맞춤 클래스에 대해 많이 알지 못합니다.

nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'Foobar': Invocation of init method failed; nested exception is org.springframework.data.mapping.PropertyReferenceException: No property object found for type Foobar! 

왜 내가이 findbyObject() 당신이 요청할 수도 있습니다 싶은 :

여기 내 오류입니까? 그래서 DB에 객체가 이미 추가되었는지 확인하고 검사를 수행하여 중복 된 행의 데이터를 DB에 삽입하지 마십시오.

의견을 보내 주시면 감사하겠습니다.

+0

전체 개체를 키로 사용하여 개체가 데이터베이스에 있는지 확인하고 싶습니까? 고유 ID가없는 이유는 무엇입니까? – CraigR8806

+0

키가 아니라 오브젝트입니다. 필자의 이해를 돕기 위해 uniqueID는 DB에 삽입 된 후에 생성됩니다. 즉, 삽입하기 전에 고유 ID를 어떻게 찾을 수 있습니까? – rj2700

+1

당신이하고 싶은 일을하기 위해, 당신은 단지 객체가 유일해야하고 고유 한 것이 필요한 필드를 골라서 현재 DB에있는 것들과 비교하여 검사해야합니다. – CraigR8806

답변

1
FindByObject 개체에 대한 보이지 않는, 그것은 말 그대로 Foobar 클래스의 필드를 찾습니다

Object. 다른 사람들이 언급 한 것처럼 객체의 다른 필드를 검사하여 이미 존재하는지 확인할 수 있습니다. 당신의 Foobar 클래스 String nameString email 필드가있는 경우

는 예를 들어, public Foobar findByNameAndEmail(String name, String email) {} 같은 방법을 만들 수 있습니다, 이러한 기준을 충족 데이터베이스에 기록이 있다면 이것은는 foobar 객체를 반환합니다.

모든 쿼리 메서드는 SQL을 복제하므로 SQL에서 개체 (레코드)로 찾을 수 있습니까? 아니, 그게 말이되지 않기 때문에. 조회는 특정 조건이 충족되는 레코드 (오브젝트)를 리턴합니다.

+0

을 제안했습니다. Hibernate가이 시나리오를 고려하지 않는다는 것은 놀랍습니다. 간단한 예로 M : 1 관계가있는 직원과 부서를 말합니다. SQL에서는 하나의 직원에 대한 정보와 다른 하나의 부서에 대한 정보를 삽입합니다. 직원 테이블에서 FK departmentID를 공유하여 동일한 부서에 속한 여러 직원을 보유 할 수 있습니다. 이렇게하면 부서 테이블에서 행을 재사용 할 수 있습니다. – rj2700

+0

당신은'@ ManyToOne' 주석을 사용하여 당신이 Hibernate에서 말하는 것을 할 수 있습니다. Hibernate에 대해 더 많이 배우고 싶습니다. 완전히 유연한 SQL 형식으로 모든 것을 할 수 있기 때문에 꽤 유연하고 간단합니다. –

+0

나는 여전히 최대 절전 모드를 배우려고 노력하고 있지만 여전히 @ManyToOne 주석이 있더라도 중복 행을 추가한다. – rj2700

0

findBy 뒤의 이름을 사용하고 where 조건을 만들려고하기 때문에 코드가 작동하지 않습니다.

그래서 findByObject가 생성 :

where object = ? 

당신이 호출 할 수있는 ID로 오브젝트를 찾을 수

findOne(?) 
+0

이 문제는 findOne()이 데이터 형식과 일치하는 param ID를 가져와야한다는 것입니다 (이 경우 Long 임). 내가 객체로 검색하고 있기 때문에, 유효하지 않습니다. – rj2700

+0

물론 이드는 객체를 가져 와서 이것을 인수로 전달할 수 있습니다.문제가 보이지 않습니다. –

+0

ID가 없습니다. 삽입시 만들어지며 그 전에 개체가 있습니다. – rj2700