FindByUUID() using Spring Data's JPA Repository
Solution 1
Try annotate your UUID
property with @org.hibernate.annotations.Type(type="org.hibernate.type.UUIDCharType")
or@org.hibernate.annotations.Type(type="org.hibernate.type.UUIDBinaryType")
I faced a problem similar while query database with UUID
due to MSB/LSB swap with UUID
in binary format; we solved the problem treating data as String and do necessary conversion before conversion.
Solution 2
Change binary column to String. Default is binary you must add this addnotation
@Type(type="org.hibernate.type.UUIDCharType")
Eg.
@Id
@GeneratedValue
@Type(type="org.hibernate.type.UUIDCharType")
public UUID id;
Solution 3
Had the same problem, specifically it works in H2 but not in MySQL.
In addition I got PRIMARY key constraint failures attempting to update the record because Hibernate (under JPA) was querying to see if the record exists and it did not find it.
Using @Column(length=16) also solves this problem neatly, assuming MySQL is using a BINARY column... otherwise the matching will fail due to the column having extra data in the DB (I think it defaults to BINARY[32]).
Related videos on Youtube
Manuel Ortiz Bey
Updated on May 23, 2022Comments
-
Manuel Ortiz Bey almost 2 years
for some reason I have not being able to find a suitable answer for this. I have the following simple entity:
@Entity @Table(name = "simple_entity") @Access(AccessType.FIELD) public class SimpleEntity { @Id @GeneratedValue(strategy = GenerationType.AUTO) protected Long id; @Column(unique = true, updatable = false) protected UUID uuid; @PrePersist protected void onCreateAbstractBaseEntity() { this.uuid = UUID.randomUUID(); } public Long getId() { return this.id; } public UUID getUuid() { return this.uuid; } }
Spring Data JPA with Hibernate creates everything correctly in my MySQL database. However, when I try to use my JPARepository implementation to search for an item using its uuid, it never finds anything, even though it executes the find query on the DB (which I can see in my debugger). Here is my JPARepository implementation:
public interface SimpleEntityRepository extends JpaRepository<SimpleEntity, Long> { SimpleEntity findOneByUuid(UUID uuid); }
Here is the controller that calls this method.
@Controller @RequestMapping("/simple_entity") public class SimpleEntityController { @Autowired private SimpleEntityRepository repository; @RequestMapping(method = RequestMethod.GET, value = "/{simpleEntityId}", produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity<FileDatastore> getSimpleEntity(@PathVariable UUID simpleEntityId) { SimpleEntity record = this.repository.findOneByUuid(simpleEntityId); HttpHeaders headers = new HttpHeaders(); HttpStatus status = (record != null) ? HttpStatus.OK : HttpStatus.NOT_FOUND; return new ResponseEntity<>(record, headers, status); }
Am I missing something?
Thanks for your help!
-
Manuel Ortiz Bey over 10 yearsDo you mean annotate thefield: protected UUID uuid; with that?