# Hibernate search projections

**URL:** <https://discourse.hibernate.org/t/hibernate-search-projections/6896>\
**Category:** Hibernate Search\
**Created:** [November 14, 2022, 2:49am UTC](https://discourse.hibernate.org/t/hibernate-search-projections/6896 "2022-11-14T02:49:28Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![Pavan\_kumar\_K.M](https://yyz1.discourse-cdn.com/flex035/user_avatar/discourse.hibernate.org/pavan_kumar_k.m/32/2102_2.png) [@Pavan\_kumar\_K.M](https://discourse.hibernate.org/u/Pavan_kumar_K.M)\
**Post date:** [November 14, 2022, 2:49am UTC](https://discourse.hibernate.org/t/hibernate-search-projections/6896/1 "2022-11-14T02:49:28Z")

</div>

INDEXED JSON

```auto
{
          "softDel" : 0,
          "addInfo" : {
            "addInfoMap" : {
              "reason" : "Order picklist success",
              "@type" : "RedisAdditionalInfoDTOSubType",
              "grStatus" : "COMPLETED",
              "documentIdList" : [
                "DOC1006",
                "DOC1008",
                "DOC1009"
              ],
              "deliveryTracking" : [
                {
                  "documentId" : "DOC1006",
                  "status" : "ENDORSED TO COURIER",
                  "date" : "2022-09-21 21:14:14"
                },
                {
                  "documentId" : "DOC1008",
                  "status" : "ENDORSED TO COURIER",
                  "date" : "2022-09-21 21:14:14"
                },
                {
                  "documentId" : "DOC1009",
                  "status" : "ENDORSED TO COURIER",
                  "date" : "2022-09-21 21:14:14"
                },
                {
                  "documentId" : "DOC1006",
                  "status" : "INTRANSIST",
                  "date" : "2022-10-21 21:14:14",
                  "remarks" : "Moved to intransist"
                },
                {
                  "documentId" : "DOC1008",
                  "status" : "INTRANSIST",
                  "date" : "2022-10-21 21:14:14",
                  "remarks" : "Moved to intransist"
                },
                {
                  "documentId" : "DOC1009",
                  "status" : "INTRANSIST",
                  "date" : "2022-10-21 21:14:14",
                  "remarks" : "Moved to intransist"
                },
                {
                  "documentId" : "DOC1006",
                  "status" : "DELIVERED",
                  "date" : "2022-10-21 21:14:14",
                  "remarks" : "Moved to intransist"
                },
                {
                  "documentId" : "DOC1008",
                  "status" : "DELIVERED",
                  "date" : "2022-10-21 21:14:14",
                  "remarks" : "Moved to intransist"
                },
                {
                  "documentId" : "DOC1009",
                  "status" : "DELIVERED",
                  "date" : "2022-10-21 21:14:14",
                  "remarks" : "Moved to intransist"
                },
                {
                  "status" : "COMPLETED",
                  "date" : "2022-10-18:13:05:04",
                  "remarks" : "GRN COMPLETED"
                }
              ],
              "sapSaleOrderId" : "12349876",
              "orderPicklistStatus" : "true",
              "notifySSIS" : "false",
              "deliveryStatus" : "COMPLETED"
            }
          },
          "cancellationDate" : null,
          "cancellationReason" : null,
          "category" : "pavan",
          "completionDate" : null,
          "description" : null,
          "expectedCompletionDate" : null,
          "externalId" : null,
          "href" : null,
          "id" : "40281082843e13a40184401f17fd007d",
          "notificationContact" : null,
          "orderDate" : "2022-11-04T00:51:30.419000000+05:30",
          "priority" : "1",
          "productOrderBlueprintMapping" : {
            "availableRetry" : 2,
            "changeDate" : "2022-11-04T00:53:44.000000000Z",
            "createDate" : "2022-11-04T00:53:44.000000000Z",
            "dependency" : null,
            "formName" : null,
            "id" : 1,
            "merged" : 0,
            "milestoneExpiryDate" : "2022-09-21T00:57:01.626000000Z",
            "orderPaused" : 0,
            "orderStartDate" : "2022-09-21T00:57:01.626000000Z",
            "ponr" : 0,
            "priority" : "1",
            "processInstanceId" : null,
            "productId" : "40281082843e13a40184401f17fb007c",
            "status" : "CREATED",
            "taskId" : null,
            "transactionId" : null,
            "uniqueId" : null,
            "workflowMaster" : {
              "bpmnFileName" : "SapSaleOrderCreation.bpmn",
              "id" : 1,
              "workFlowId" : "SaleOrderCreationId",
              "workflowName" : "SAP_SALE_ORDER_CREATION"
            }
          },
          "productOrderChannels" : {
            "softDel" : 0
          },
          "productOrderItem" : {
            "softDel" : 0,
            "action" : "add",
            "bluePrintId" : null,
            "id" : "40281082843e13a40184401f17fb007c",
            "productOrderItemType" : "bdl",
            "productRefOrValue" : {
              "softDel" : 0
            },
            "quantity" : 1,
            "state" : "ACKNOWLEDGED"
          },
          "relatedParty" : [
            {
              "softDel" : 0,
              "href" : null,
              "name" : "c8b46baa-36ba-43a5-9e13-3a3c69deb466",
              "role" : "CreatedBy"
            },
            {
              "softDel" : 0,
              "href" : null,
              "name" : "RD",
              "role" : "DistributorType"
            },
            {
              "softDel" : 0,
              "href" : null,
              "name" : "10001",
              "role" : "DistributorId"
            },
            {
              "softDel" : 0,
              "href" : null,
              "name" : "138849340104300105",
              "role" : "AddressId"
            }
          ],
          "requestedCompletionDate" : null,
          "requestedStartDate" : null,
          "state" : "ACKNOWLEDGED",
          "_entity_type" : "ProductOrderEntity"
        }

```

Projection class

```auto
public class ProductOrderProjection implements Serializable{

	private static final long serialVersionUID = 1L;
	
	private String id;
	private String href;
	private OffsetDateTime cancellationDate;
	private String cancellationReason;
	private String category;
	private OffsetDateTime completionDate;
	private String description;
	private OffsetDateTime expectedCompletionDate;
	private String externalId;
	private String notificationContact;
	private OffsetDateTime orderDate;
	private String priority;
	private OffsetDateTime requestedCompletionDate;
	private OffsetDateTime requestedStartDate;
	private ProductOrderStateType state;
	private List<ProductOrderItemProjection> productOrderItem;
	private List<RelatedPartyProjection> relatedParty;
	private List<ProductOrderBlueprintMappingProjection> productOrderBlueprintMapping;
	private AdditionalInfoProjection addInfo;
	
	@ProjectionConstructor
	public ProductOrderProjection(String id, String href, OffsetDateTime cancellationDate, String cancellationReason,
			String category, OffsetDateTime completionDate, String description, OffsetDateTime expectedCompletionDate,
			String externalId, String notificationContact, OffsetDateTime orderDate, String priority,
			OffsetDateTime requestedCompletionDate, OffsetDateTime requestedStartDate, ProductOrderStateType state,
			List<ProductOrderItemProjection> productOrderItem, List<RelatedPartyProjection> relatedParty,
			List<ProductOrderBlueprintMappingProjection> productOrderBlueprintMapping,
			AdditionalInfoProjection addInfo) {
		super();
		this.id = id;
		this.href = href;
		this.cancellationDate = cancellationDate;
		this.cancellationReason = cancellationReason;
		this.category = category;
		this.completionDate = completionDate;
		this.description = description;
		this.expectedCompletionDate = expectedCompletionDate;
		this.externalId = externalId;
		this.notificationContact = notificationContact;
		this.orderDate = orderDate;
		this.priority = priority;
		this.requestedCompletionDate = requestedCompletionDate;
		this.requestedStartDate = requestedStartDate;
		this.state = state;
		this.productOrderItem = productOrderItem;
		this.relatedParty = relatedParty;
		this.productOrderBlueprintMapping = productOrderBlueprintMapping;
		this.addInfo = addInfo;
	}	
}

```

```auto
public class ProductOrderBlueprintMappingProjection implements Serializable{

	private static final long serialVersionUID = 1L;
	private String productId;
	private String priority;
	private String status;
	private String uniqueId;
	private int merged;
	private String dependency;
	private String processInstanceId;
	private Date createDate;
	private Date changeDate;
	private String transactionId;
	private String taskId;
	private String formName;
	private Integer availableRetry;
	private int ponr;
	private Date orderStartDate;
	private Integer orderPaused;
	private Date milestoneExpiryDate;
	private WorkflowMasterProjection workflowMaster;
	
	@ProjectionConstructor
	public ProductOrderBlueprintMappingProjection(String productId, String priority, String status, String uniqueId,
			int merged, String dependency, String processInstanceId, Date createDate, Date changeDate,
			String transactionId, String taskId, String formName, Integer availableRetry, int ponr, Date orderStartDate,
			Integer orderPaused, Date milestoneExpiryDate) {
		super();
		this.productId = productId;
		this.priority = priority;
		this.status = status;
		this.uniqueId = uniqueId;
		this.merged = merged;
		this.dependency = dependency;
		this.processInstanceId = processInstanceId;
		this.createDate = createDate;
		this.changeDate = changeDate;
		this.transactionId = transactionId;
		this.taskId = taskId;
		this.formName = formName;
		this.availableRetry = availableRetry;
		this.ponr = ponr;
		this.orderStartDate = orderStartDate;
		this.orderPaused = orderPaused;
		this.milestoneExpiryDate = milestoneExpiryDate;
	}

}

```

```auto
public class WorkflowMasterProjection implements Serializable{

	private static final long serialVersionUID = 1L;
	private Integer id;
	private String workflowName;
	private String workFlowId;
	private String bpmnFileName;
	
	
	@ProjectionConstructor
	public WorkflowMasterProjection(Integer id, String workflowName, String workFlowId, String bpmnFileName) {
		super();
		this.id = id;
		this.workflowName = workflowName;
		this.workFlowId = workFlowId;
		this.bpmnFileName = bpmnFileName;
	}
	
}

```

CODE to retrive data:

```auto
ElasticsearchSearchResult<ProductOrderProjection> elasticResponse = Search.session(entityManager).search(ProductOrderEntity.class)
				.extension(ElasticsearchExtension.get())
				.select(ProductOrderProjection.class)
				.where(f -> f.fromJson(json)).fetch(offset, limit);

```

ERROR:

Error occured:  
`org.hibernate.search.util.common.SearchException: HSEARCH400655: Invalid cardinality for projection on field 'productOrderBlueprintMapping.workflowMaster.id': the projection is single-valued, but this field is effectively multi-valued in this context, because parent object field 'productOrderBlueprintMapping' is multi-valued. Either call '.multi()' when you create the projection on field 'productOrderBlueprintMapping.workflowMaster.id', or wrap that projection in an object projection like this: 'f.object("productOrderBlueprintMapping").from(<the projection on field productOrderBlueprintMapping.workflowMaster.id>).as(...).multi()'.`

HI Team can u please help me with this.

---

<div class="post-metadata">

**Author:** ![mbekhta](https://yyz1.discourse-cdn.com/flex035/user_avatar/discourse.hibernate.org/mbekhta/32/2044_2.png) [@mbekhta](https://discourse.hibernate.org/u/mbekhta)\
**Post date:** [November 14, 2022, 3:15pm UTC](https://discourse.hibernate.org/t/hibernate-search-projections/6896/2 "2022-11-14T15:15:35Z")

</div>

Hi @Pavan_kumar_K.M, thanks for reaching out!

It seems that there’s a mismatch after trying to match the JSON document and the projection classes you’ve provided.

> [@Pavan\_kumar\_K.M](#):
>
> ```auto
> private List<ProductOrderBlueprintMappingProjection> productOrderBlueprintMapping;
> 
> ```

you are expecting a list here while your element in the JSON is an object:

> [@Pavan\_kumar\_K.M](#):
>
> ` "productOrderBlueprintMapping" : {`

and then your constructor for `ProductOrderBlueprintMappingProjection` seems to be missing a parameter for this field:

> [@Pavan\_kumar\_K.M](#):
>
> ```auto
> private WorkflowMasterProjection workflowMaster;
> 
> ```

I don’t see here how you’ve mapped your entities, but I suspect that there is a collection of `workflowMaster` so you might to take a look at [`NESTED` structure](https://docs.jboss.org/hibernate/search/6.1/reference/en-US/html_single/#mapper-orm-indexedembedded-structure-nested) depending what you are trying to achieve.

---

<div class="post-metadata">

**Author:** ![Pavan\_kumar\_K.M](https://yyz1.discourse-cdn.com/flex035/user_avatar/discourse.hibernate.org/pavan_kumar_k.m/32/2102_2.png) [@Pavan\_kumar\_K.M](https://discourse.hibernate.org/u/Pavan_kumar_K.M)\
**Post date:** [November 15, 2022, 1:50am UTC](https://discourse.hibernate.org/t/hibernate-search-projections/6896/3 "2022-11-15T01:50:09Z")

</div>

> [@Pavan\_kumar\_K.M](#):
>
> ```auto
> public class WorkflowMasterProjection implements Serializable{
> 
> private static final long serialVersionUID = 1L;
> private Integer id;
> private String workflowName;
> private String workFlowId;
> private String bpmnFileName;
> 	
> 	
> @ProjectionConstructor
> public WorkflowMasterProjection(Integer id, String workflowName, String workFlowId, String bpmnFileName) {
> super();
> this.id = id;
> this.workflowName = workflowName;
> this.workFlowId = workFlowId;
> this.bpmnFileName = bpmnFileName;
> }
> 	
> }
> 
> ```

It worked after below changes thanks for the quick response

public class WorkflowMasterProjection implements Serializable{

```
private static final long serialVersionUID = 1L;
private List<Integer> id;
private List<String> workflowName;
private List<String> workFlowId;
private List<String> bpmnFileName;

```

}
