๊ด€๋ฆฌ ๋ฉ”๋‰ด

chae._.chae

[Error] : For queries with named parameters you need to use provide names for method parameters ๋ณธ๋ฌธ

Error

[Error] : For queries with named parameters you need to use provide names for method parameters

walbe0528 2022. 2. 22. 10:56
728x90
๋ฐ˜์‘ํ˜•

๐ŸŽฏ ์Šคํ”„๋ง JPA์—์„œ nativeQuery๋ฅผ ์ด์šฉํ•˜์—ฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ฐœ์ƒํ•œ ์—๋Ÿฌ

 

   ์•„๋ž˜์˜ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰์‹œ์ผฐ๋”๋‹ˆ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. 

@DataJpaTest  // JPA์™€ ์—ฐ๋™ํ•œ ํ…Œ์ŠคํŠธ
class CommentRepositoryTest {

    @Autowired
    CommentRepository commentRepository;

    @Test
    @DisplayName("ํŠน์ • ๊ฒŒ์‹œ๊ธ€์˜ ๋ชจ๋“  ๋Œ“๊ธ€ ์กฐํšŒ")  // ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ์— ๋ณด์—ฌ์ค„ ์ด๋ฆ„
    void findByArticleId() {
        /* Case 1 : 4๋ฒˆ ๊ฒŒ์‹œ๊ธ€์˜ ๋ชจ๋“  ๋Œ“๊ธ€ ์กฐํšŒ*/
        {
            // ์ž…๋ ฅ๋ฐ์ดํ„ฐ ์ค€๋น„
            Long articleId = 4L;

            // ์‹ค์ œ ์ˆ˜ํ–‰
            List<Comment> comments = commentRepository.findByArticleId(articleId);

            // ์˜ˆ์ƒํ•˜๊ธฐ
            Article article = new Article(4L, "๋‹น์‹ ์˜ ์ธ์ƒ ์˜ํ™”๋Š”?", "๋Œ“๊ธ€ ใ„ฑ");
            Comment a = new Comment(1L, article, "Park", "๊ตณ ์œŒ ํ—ŒํŒ…");
            Comment b = new Comment(2L, article, "Kim", "์•„์ด ์—  ์ƒ˜");
            Comment c = new Comment(3L, article, "Choi", "์‡ผ์ƒํฌ์˜ ํƒˆ์ถœ");
            List<Comment> expected = Arrays.asList(a, b, c);

            // ๊ฒ€์ฆ
            assertEquals(expected.toString(), comments.toString(), "4๋ฒˆ ๊ธ€์˜ ๋ชจ๋“  ๋Œ“๊ธ€ ์ถœ๋ ฅ!");
        }
    }
}

 

- CommentRepository ์ธํ„ฐํŽ˜์ด์Šค

public interface CommentRepository extends JpaRepository<Comment, Long> {
    // ํŠน์ • ๊ฒŒ์‹œ๊ธ€์˜ ๋ชจ๋“  ๋Œ“๊ธ€ ์กฐํšŒ
    @Query(value =
            "SELECT *" +
            " FROM comment" +
            " WHERE article_id = :articleId",
            nativeQuery = true)
    List<Comment> findByArticleId(Long articleId);

    // ํŠน์ • ๋‹‰๋„ค์ž„์˜ ๋ชจ๋“  ๋Œ“๊ธ€ ์กฐํšŒ
    List<Comment> findByNickname(String nickname);
}

 

- findBynickname์˜ xmlํŒŒ์ผ

<?xml version="1.0" encoding="UTF-8" ?>
<entity-mappings xmlns="http://xmlns.jcp.org/xml/ns/persistence/orm"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence/orm
                        http://xmlns.jcp.org/xml/ns/persistence/orm_2_2.xsd"
                 version="2.2">

    <named-native-query
            name="Comment.findByNickname"
            result-class="com.example.firstproject.entity.Comment">
        <query>
            <![CDATA[
                SELECT
                    *
                FROM
                    comment
                WHERE
                    nickname = :nickname
                ]]>
        </query>
    </named-native-query>
</entity-mappings>

 

[Error ๋ฌธ๊ตฌ]

org.springframework.dao.InvalidDataAccessApiUsageException: For queries with named parameters you need to use provide names for method parameters. Use @Param for query method parameters, or when on Java 8+ use the javac flag -parameters.; nested exception is java.lang.IllegalStateException: For queries with named parameters you need to use provide names for method parameters. Use @Param for query method parameters, or when on Java 8+ use the javac flag -parameters.

 

 

[๋ฌธ์ œํ•ด๊ฒฐ]

 

@Param ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, Java8+์—์„œ๋Š” -parameters๋ฅผ ์‚ฌ์šฉํ•˜๋ผ๊ณ  ์•Œ๋ ค์ฃผ๊ณ  ์žˆ๋‹ค. 

SQL ๋ฌธ์— ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ๋•Œ๋Š” ์ „๋‹ฌ๋˜๋Š” ๋ณ€์ˆ˜๋“ค์— @Param์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์—ฌ์ค˜์•ผํ•œ๋‹ค. 

์ ์–ด์ฃผ์ง€ ์•Š์œผ๋ฉด ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ฐพ์ง€ ๋ชปํ•ด ์—๋Ÿฌ๊ฐ€ ๋‚œ๋‹ค.  (@Param๋ฟ๋งŒ ์•„๋‹ˆ๋ผ,  '#{  }'๋ฅผ ์‚ฌ์šฉ๋˜๊ธฐ๋„ ํ•œ๋‹ค.)

 

@Query(value =
            "SELECT *" +
            " FROM comment" +
            " WHERE article_id = :articleId",
            nativeQuery = true)
    List<Comment> findByArticleId(@Param("articleId")Long articleId);

์œ„์˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ, @Param("articleId")๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ํ•ด๊ฒฐ๋œ๋‹ค

 

 

+ ์ถ”๊ฐ€

 

findByArticleId๋ง๊ณ  findBynickname์—๋„ ์•„๋ž˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ @Param์„ ๋„ฃ์–ด์ค˜์•ผํ•œ๋‹ค....

(findnickname ํ…Œ์ŠคํŠธ์‹œ์—๋„ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ด์„œ ์™„์ „ ์‹๊ฒ,,)

์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”๊ฒŒ ์ง€๊ทนํžˆ ๋‹น์—ฐํ•˜์ง€๋งŒ ๊ทธ๋ž˜๋„ ์•„์ง์€ ์ข€ ๋ฌด์„œ์›Œ..

 List<Comment> findByNickname(@Param("nickname")String nickname);

๋‘ ์—๋Ÿฌ ๋ชจ๋‘ @Param ์–ด๋…ธํ…Œ์ด์…˜์„ ์ ์ง€ ์•Š์•„์„œ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ฐพ์ง€ ๋ชปํ•˜๋Š” ์—๋Ÿฌ์ธ๋ฐ, ์—๋Ÿฌ ๋ฌธ๊ตฌ๊ฐ€ ์กฐ๊ธˆ ๋‹ฌ๋ž๋‹ค. 

findBynickname์˜ ์—๋Ÿฌ๋ฌธ๊ตฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. 

 

[Error ๋ฌธ๊ตฌ]

org.springframework.dao.InvalidDataAccessApiUsageException: Could not locate ordinal parameter [1], expecting one of [];  nested exception is java.lang.IllegalArgumentException: Could not locate ordinal parameter [1], expecting one of []

 

๋‚ด ์ƒ๊ฐ์œผ๋กœ๋Š”, findByArticleId๋Š” @Query์–ด๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด์„œ ์ง์ ‘ sql์„ ์ž‘์„ฑํ•˜์˜€๊ณ (native query๋ฅผ ์‚ฌ์šฉํ•˜์˜€๊ณ ), findBynickname์€ sql์„ xml๋กœ ์ž‘์„ฑํ•˜์—ฌ ๋‹ค๋ฅธ ๊ฒƒ ๊ฐ™๋‹ค. 

(์ •ํ™•ํ•˜์ง€์•Š์Œ..)

728x90