99

The requirement is that the user can write an article, therefore I choose type Text for the content field inside mysql database. How can I convert Java String into MySQL Text

Here you go Jim Tough

@Entity
public class Article implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private Long userId;

    private String title;

    private String content;

    private Integer vote;

    //Constructors, setters, getters, equals and hashcode
}

In my MYSQL database, content is type Text. I was hoping that there would be something like this java.sql.Text, since java.sql.Blob is an actual type, but sadly, that does not exist

Pascal Thivent
  • 562,542
  • 136
  • 1,062
  • 1,124
Thang Pham
  • 38,125
  • 75
  • 201
  • 285

3 Answers3

147

Since you're using JPA, use the Lob annotation (and optionally the Column annotation). Here is what the JPA specification says about it:

9.1.19 Lob Annotation

A Lob annotation specifies that a persistent property or field should be persisted as a large object to a database-supported large object type. Portable applications should use the Lob annotation when mapping to a database Lob type. The Lob annotation may be used in conjunction with the Basic annotation. A Lob may be either a binary or character type. The Lob type is inferred from the type of the persistent field or property, and except for string and character-based types defaults to Blob.

So declare something like this:

@Lob 
@Column(name="CONTENT", length=512)
private String content;

References

  • JPA 1.0 specification:
    • Section 9.1.19 "Lob Annotation"
Ortomala Lokni
  • 56,620
  • 24
  • 188
  • 240
Pascal Thivent
  • 562,542
  • 136
  • 1,062
  • 1,124
  • 34
    On Hibernate JPA MYSQL, using `@Lob` plus `@Column` annotation on a String field gives "wrong column type, expected longtext but column type is text". But the problem is solved when I used `@Column(columnDefinition = "text")` – gerrytan Apr 18 '13 at 00:22
  • 4
    What's the sense in combining `@Lob` and `@Column(length=512)`? Why not just be happy with `@Lob`? Both make no difference when using Hibernate JPA MySQL. Both result in the MySQL field type `longtext`. – Socrates Mar 06 '17 at 15:07
  • I had a binary column type, and the `@Lob` annotation didn't work for me. However, `@Column(length=8192)` worked great and solved my problem. – Lawrence Jun 08 '18 at 23:35
144

With @Lob I always end up with a LONGTEXTin MySQL.

To get TEXT I declare it that way (JPA 2.0):

@Column(columnDefinition = "TEXT")
private String text

Find this better, because I can directly choose which Text-Type the column will have in database.

For columnDefinition it is also good to read this.

EDIT: Please pay attention to Adam Siemions comment and check the database engine you are using, before applying columnDefinition = "TEXT".

Community
  • 1
  • 1
Malte
  • 1,937
  • 1
  • 15
  • 20
  • 4
    This is not a good solution, as TEXT data column is not available in all the databases engines, e.g. HSQLDB, details: http://stackoverflow.com/questions/4213782/hibernate-postgresql-hsqldb-text-column-incompatibility-problem – Adam Siemion Sep 01 '14 at 10:01
  • 1
    this is what i wanted because it is what is available in all production databases, and does not have the issue with "longtext" when i don't want it. – Nicholas DiPiazza Jan 10 '15 at 20:48
43

for mysql 'text':

@Column(columnDefinition = "TEXT")
private String description;

for mysql 'longtext':

@Lob
private String description;
Maxpan
  • 563
  • 5
  • 8