cannot be cast to java lang string

I have the following and I get the error

java.lang.String cannot be cast to [Ljava.lang.String;

I have changed the Object[] to String[] because I faced the next error:

java.lang.Object cannot be cast to [Ljava.lang.String;

4 Answers 4

java.lang.String cannot be cast to [Ljava.lang.String;

This error occurs when you try to cast a String to an array of String .

For example:

For me you get this error because query.getResultList() returns a List or List instead of List such that when you try to cast a value as a String[] you get this exception.

According to the Javadoc createNativeQuery(String) returns a result of type Object[] or a result of type Object if there is only one column in the select list.

Approach #1

One simple way to fix it, could be to rely on the raw type for the result (it is not the most elegant approach but the simplest one) then later you can check the type of the content of the list to cast it properly.

Then to check the type you can proceed as next:

Approach #2

A more elegant way could be to create a POJO and use createNativeQuery(String sqlString, Class resultClass) to create your query, this way it will automatically map your columns with the fields of your POJO

Cause of java.lang.ClassCastException in Java

Here are some of the most frequently occurred ClassCastException in Java:

java.lang.classcastexception java.lang.string cannot be cast to java.lang.integer

This will come when you try to cast String object to Integer i.e.
Integer number = (Integer) stringObject;

java.lang.classcastexception java.lang.string cannot be cast to java.util.date :
This error will come when you cast String to Date in Java, since both are not related to each other, it will not possible to typecast them.

java.lang.classcastexception java.util.arraylist cannot be cast to java.lang.string
I have seen this happening a lot in beginners code based on Java Collection framework, Since ArrayList and String are not related to each other, following casting will throw this error :

String str = (String) arrayListObject;

But if you definitely wants to convert ArrayList to String, than check this post about converting collection to String in Java.

Here are couple of more examples, which is self explanatory.

Last modified: May 29, 2019

I just announced the new Learn Spring course, focused on the fundamentals of Spring 5 and Spring Boot 2:

1. Introduction

Of course, we’d never suppose that we can cast a String to a String array in Java:

But, this turns out to be a common JPA error.

In this quick tutorial, we’ll show how this comes up and how to solve it.

2. Common Error Case in JPA

In JPA it’s not uncommon to get this error when we work with native queries and we use the createNativeQuery method of the EntityManager.

Its Javadoc actually warns us that this method will return a list of Object[], or just an Object if only one column is returned by the query.

Let’s see an example. First, let’s create a query executor that we want to reuse to execute all of our queries:

As seen above, we’re using the createNativeQuery() method and we always expect a result set that contains a String array.

After that, let’s create a simple entity to use in our examples:

And finally, let’s create a test class that inserts a Message before running the tests:

Now, we can use our QueryExecutor to execute a query that retrieves the text field of our entity:

As we can see, because there is only one column in the query, JPA will actually return a list of strings, not a list of string arrays. We get a ClassCastException because the query returns a single column and we were expecting an array.

3. Manual Casting Fix

The simplest way to fix this error is to check the type of the result set objects in order to avoid the ClassCastException. Let’s implement a method to do so in our QueryExecutor:

Then, we can use this method to execute our query without getting an exception:

This is not an ideal solution since we have to convert the result to an array in case the query returns only one column.

4. JPA Entity Mapping Fix

Another way to fix this error is by mapping the result set to an entity. This way, we can decide how to map the results of our queries in advance and avoid unnecessary castings.

Let’s add another method to our executor to support the usage of custom entity mappings:

After that, let’s create a custom SqlResultSetMapping to map the result set of our previous query to a Message entity:

In this case, we also have to add a constructor that matches our newly created SqlResultSetMapping:

Finally, we can use our new executor method to run our test query and get a list of Message:

This solution is much cleaner since we delegate the result set mapping to JPA.

5. Conclusion

In this article, we’ve shown that native queries are a common place to get this ClassCastException. We also looked at doing the type check ourselves as well as solving it by mapping the query results to a transport object.

As always, the full source code of the examples is available over on GitHub.

Оцените статью