0
votes

I'm beginner (sorry for my bad explanation, feel free to correct me) in MyBatis Spring-Boot, I have problem to understand and make it works @Many

I'm using 3 layer logic programming (Presentation Layer, Service Layer, Data Layer)

Thanks for your help :)

I have 3 Tables (it's TB_Products and not TB_Product as on the screenshot):

enter image description here

I would like to get data form table TB_Users and TB_Products to "put" it in DTO

  • I create 4 java object class SearchEntity, ProductEntity (for Data layer)

  • I create an interface SearchRepositoryMapper.

  • I also create a SearchService interface and SearchServiceImpl as well.

Java object class:

SearchEntity

public class SearchEntity implements Serializable{

    private static final long serialVersionUID = -9143930742617602050L;

    private String id;
    private String firstName;
    private String lastName;
    private List<ProductEntity> products;


                       // Getters and Setters code .....

}

ProductEntity

public class ProductEntity implements Serializable{

    private static final long serialVersionUID = -6525703679290992635L;

    private String id;
    private String productId;
    private String product;
    private String number;
    private String date;
    private String description;


                       // Getters and Setters code .....
}

SearchRepositoryMapper

public interface SearchRepositoryMapper {

    // Get some fields from TB_Users and all fields from TB_Products 
    @Select("SELECT * FROM TB_Users WHERE id = #{id}")
    @Results({
            @Result(property = "id", column ="id"),
            @Result(property = "firstName", column = "firstName"),
            @Result(property = "lastName", column= "lastName"),
            @Result(property = "products", javaType = List.class, column="id",
                    many = @Many(select = "getProductIdByUserId"))})
    public SearchEntity findAllInfoByUserId(@Param("id") int id);


    @Select("SELECT *, productId FROM TB_Products WHERE productId = #{id}")
    public ArrayList<ProductEntity> getProductIdByUserId(@Param("id") int id);



    // Find id by uderId and return null if it doesn't exist
    @Select("SELECT id FROM TB_Users WHERE userId = #{userId}")
    int findIdByUserId(@Param("userId") String userId);
}

SearchServiceImpl

@Service
public class SearchServiceImpl implements SearchService {

    @Autowired
    SearchRepositoryMapper searchRepository;

    @Override
    public SearchDto getAllInfoByUserId(String id) {

        SearchDto returnValue = new SearchDto();                                // Init returnValue as SearchDto
        int searchId = searchRepository.findIdByUserId(id);                             // Init searchId with the TB_Users id


        SearchEntity searchEntity = searchRepository.findAllInfoByUserId(searchId);

        BeanUtils.copyProperties(searchEntity, returnValue);

        return returnValue;
    }

}

So when I execute the code and do a GET request I get this error message:

{
    "message": "nested exception is org.apache.ibatis.executor.ExecutorException: Statement returned more than one row, where no more than one was expected."
}

I found out that come from the mapper and SearchEntity searchEntity = searchRepository.findAllInfoByUserId(searchId);

But i don't know how to resolve it. The way I wrote the code is wrong

Thanks to correct me

1

1 Answers

1
votes

The exception clearly says that the query returns multiple results. Plese verify if the data in the table is correct.