Customize Spring boot ORM table column name - spring-boot

I am using Spring JPA. There is a class for JPA enitity
#Entity
#Table(name = SchemaConstant.MENU_TABLE)
public class Menu extends BaseEntity {
#NotNull private String title;
private String path;
private UUID parentId;
private boolean hasSub;
private String iconName;
}
And the snapshot of the database table columns are shown below
If you see the table columns order is not the same as the class order. Now I want to reorder this table's columns.
Like column 1 -> id, column 2 -> title, column 3 -> icon_name as requires
Is there any way of customizing the order of the table columns?

Related

map a #OneToMany relationship using a string column as a key

Good Morning!
I would like to know if there is a way to map a #OneToMany relationship using a string column as a key. The database in SQL Server already has all the tables, but their relationship was not made by the id, but by values ​​of type string. Can anyone help me?
Example:
student table with the fields name, phone, emailthe key of this table is the column "name"
class tablewith the fields name, date, discipline the key of this table is the column "name" that refers to "student name".
as I tried to do:
#Entity
public class Student {
...
#OneToMany(mappedBy = "student")
private List<Class> class = new ArrayList<>();
}
#Entity
public class Class{
...
#ManyToOne
#JoinColumn(name = "student_id")
private Student student;
}
When I run it through H2, it creates a column with the students' id, but I would like it to map the data that is already in the database, because I can't change the data structure. Can someone help me?
String is a valid type for an identifier. If you don't want an additional id column, you can map name as an identifier:
#Entity
public class Student {
#Id
#Column(name = "`name`")
String name;
#OneToMany(mappedBy = "student")
private List<Class> class = new ArrayList<>();
...
}
For some databases name is a special keyword, if you use #Column(name = "`name`"), Hibernate will handle it correctly.

Spring data jpa find by between on id field

I am trying to retrieve some rows from my DB, like
select * from my_table where id between 1 and 100;
Is there any option in JpaRepository for between on primary key?
Any custom method can be written in JPARepo. You need to make sure you are following JPA rules. The field name should exist in the method, In bellow method Id is my field name in my Entity class.
Entity Class
#Entity
#Setter#Getter
public class Course {
#Id
#GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;
private String name;
}
Repo Class
#Repository
public interface CourseSprngDataRepo extends JpaRepository<Course, Long>{
List<Course> findByIdBetween(Long l, Long m);
List<Course> findByIdBetweenOrderByNameAsc(long l, long m);//Between and Order by another column ex
}

I have a field in database which I do not want to map in my spring java model while making a get call

I have a database table in which there is a field which I do not want to map to my model class while making a get call. Is there any annotation to handle this use case?
When persisting Java objects into database records using an Object-Relational Mapping (ORM) framework, we can ignore fields by adding the #Transient annotation to those fields.
#Entity
#Table(name = "Users")
public class User {
#Id
private Integer id;
private String email;
private String password;
#Transient
private Date loginTime;
// getters and setters
}

How to load insert scripts for multiple tables which are linked with foreign key in spring boot

I am using spring boot. I am loading test data through yml by defining spring.datasource.data=classpath:/test-data/sql_file_EntityOne.sql, classpath:/test-data/sql_file_EntityTwo.sql,...
For every single entity it works seamlessly but problem comes when EntityOne and EntityTwo have foreign key relationship and the corresponding insert statements are written in 2 different SQL files as depicted above.
I am using in memory h2 dB for local.
sql_file_EntityOne.sql
(Id_One, data_1,data_2) values(101, 'dat', 5)
sql_file_EntityTwo.sql
(Id_two, Id_Onethis is fk, data_3,data_4)
values(1,101, 'dat2', null, 5)
EntityOne
#Id
IdOne
....
#OneToMany(Cascade.All, mappedBy="entityOneRef")
List entityTwoRef
EntityTwo
#Id
IdTwo
....
#ManyToOne(Cascade.All)
#JoinColumn("entityTwoRef")
EntityOne entityOneRef
Can you please mention the error you are getting here?
You can use the following hibernate annotations for bidirectional relationship:
#OneToMany(mappedBy = ) on parent enity
#ManyToOne #JoinColumn(name = , nullable = false) on child entity
for example, let's take an example of Cart and Item as two entities with a Cart related as one to many with item:
//Cart
#Entity
#Data
public class Cart {
#Id
private Integer cartId;
#Column
private String data;
#OneToMany(mappedBy = "cart")
private Set<Item> items;
}
//Item
#Entity
#Data
public class Item {
#Id
private Integer itemId;
#Column
private String data;
#ManyToOne
#JoinColumn(name = "cart_id", nullable = false)
private Cart cart;
}
#Data is just lombok annotation for getters and setters. Scripts as below:
//Script1
INSERT INTO CART(cart_id,data) VALUES (101,'data1')
//Script2
INSERT INTO ITEM(item_id,cart_id,data) VALUES (1,101,'data2')
Then load the scripts in spring-boot in order:
spring.datasource.data=classpath:sql_script1.sql,classpath:sql_script2.sql
Hope it helps :)

Spring JPA query for many to many

I have an entity User and System
#Entity
public class User {
private Long id;
private String name;
}
#Entity
public class System{
private Long id;
private Long SystemId;
#ManyToMany
private Set<User> users;
}
and one table created by hibernate legalhold_system
I want to get all the user related to System ID, I can fetch the same using below native query
select * from user where id in (select user_id from legalhold_system where system_id in(select id from system_user where system_id=:1))
How can I achieve the same with Spring JPA query, As I don't have legalhold_system entity present in Code?
If these are the only two entities, it should be doable using this query:
SELECT s.users FROM System s WHERE s.systemId = :systemId

Resources