I have 3 entities.
@Data
public class Data {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private String OrderNumber;
private String ValveName;
private String SerialNumber;
private String ValvePort;
private String TestNumber;
private String ValveType;
@OneToOne(orphanRemoval = true, cascade = CascadeType.ALL)
private Current current;
@OneToOne(orphanRemoval = true, cascade = CascadeType.ALL)
private Flow flow;
And these two childs looks like this:
@Setter
@Getter
public class Current{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private float s0;
private float s1;
private float s2;
private float s3;
And this
@Setter
@Getter
public class Flow {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private float f0;
private float f1;
private float f2;
private float f3;
Expection:
When I save a new data, I will both save these two childs at the same time. The data is an object
Data data = new Data();
Flow flow = new Flow();
Current current = new Current ();
// Do some logic and fill the values for flow and current object and also data object
// Also include current and flow into data object
data.setCurrent(current);
data.setFlow(flow);
// Save to the database
data_Repository.save(data);
Also, if I change the fields in the data, I will just update both current and flow.
Problems:
When I pick up an data-object and then change one parameter, then I save it.
Then this will not work.
@Repository
public interface Data_Repository extends JpaRepository<Data, Long> {
@Transactional
@Query(value = "SELECT * FROM data WHERE LOWER(order_number) LIKE LOWER(CONCAT('%', :orderNumber,'%')) AND LOWER(valve_name) LIKE LOWER(CONCAT('%', :valveName,'%')) AND LOWER(serial_number) LIKE LOWER(CONCAT('%', :serialNumber,'%')) AND LOWER(valve_port) LIKE LOWER(CONCAT('%', :valvePort,'%')) AND LOWER(test_number) LIKE LOWER(CONCAT('%', :testNumber,'%')) AND LOWER(valve_type) LIKE LOWER(CONCAT('%', :valveType,'%')) ORDER BY id DESC OFFSET 0 ROWS FETCH NEXT :maxLog ROWS ONLY", nativeQuery = true)
List<Data> findByMultipleValues(@Param("orderNumber") String orderNumber, @Param("valveName") String valveName, @Param("serialNumber") String serialNumber, @Param("valvePort") String valvePort, @Param("testNumber") String testNumber, @Param("valveType") String valveType, @Param("maxLog") Integer maxLog);
The problem is this part:
LOWER(order_number) LIKE LOWER(CONCAT('%', :orderNumber,'%')) AND LOWER(valve_name) LIKE LOWER(CONCAT('%', :valveName,'%')) AND LOWER(serial_number) LIKE LOWER(CONCAT('%', :serialNumber,'%')) AND LOWER(valve_port) LIKE LOWER(CONCAT('%', :valvePort,'%')) AND LOWER(test_number) LIKE LOWER(CONCAT('%', :testNumber,'%')) AND LOWER(valve_type) LIKE LOWER(CONCAT('%', :valveType,'%'))
In MySQL, it works perfect!
But in Microsoft SQL...it does not work! Why?
I can still receive these rows by using, but not the repository-command above after I HAVE CHANGED the entity row. Why?
data_Service.findAll();
I'm using Microsoft 2012 SQL Server.
Summerize:
This results that it can give me data, even if I have changed the and saved one data entity.
@Query(value = "SELECT * FROM data ORDER BY id DESC OFFSET 0 ROWS FETCH NEXT :maxLog ROWS ONLY", nativeQuery = true)
List<Data> findByMultipleValues(@Param("maxLog") Integer maxLog);
This will not give me anything after I have updated one entity. The entities who are not updated, are still there avaiable too see.
@Query(value = "SELECT * FROM data WHERE LOWER(order_number) LIKE LOWER(CONCAT('%', :orderNumber,'%')) AND LOWER(valve_name) LIKE LOWER(CONCAT('%', :valveName,'%')) AND LOWER(serial_number) LIKE LOWER(CONCAT('%', :serialNumber,'%')) AND LOWER(valve_port) LIKE LOWER(CONCAT('%', :valvePort,'%')) AND LOWER(test_number) LIKE LOWER(CONCAT('%', :testNumber,'%')) AND LOWER(valve_type) LIKE LOWER(CONCAT('%', :valveType,'%')) ORDER BY id DESC OFFSET 0 ROWS FETCH NEXT :maxLog ROWS ONLY", nativeQuery = true)
List<Data> findByMultipleValues(@Param("orderNumber") String orderNumber, @Param("valveName") String valveName, @Param("serialNumber") String serialNumber, @Param("valvePort") String valvePort, @Param("testNumber") String testNumber, @Param("valveType") String valveType, @Param("maxLog") Integer maxLog);